首页 > 解决方案 > 使用 Node.js 流式传输 JSON

问题描述

我被分配了一项任务——我正在尝试仅使用 Node 来制作路由/端点,以更好地展示 Express 幕后发生的事情。但我必须使用流。

我有两条路线GET /songs,并GET/refresh-songs具有以下要求:

我们需要以下两个端点:

获取 /songs
获取 /refresh-songs

所有端点都应返回带有正确标头的 JSON

/歌曲应该...

如果该文件或目录不存在,来自 src/data/songs.json 文件的流数据不会使服务器崩溃

在这种情况下触发刷新代码的奖励积分用于压缩响应的奖励积分

/刷新歌曲应该...

立即返回它不应该在刷新歌曲时保持响应

返回带有状态 JSON 响应的 202 状态代码

继续从 iTunes 前端获取歌曲应该有

用于触发此端点的 UI/按钮

到目前为止,这就是server.js我的端点所在的文件中的内容。

const { createServer } = require('http');
const { parse: parseUrl } = require('url');
const { createGzip } = require('zlib');
const { songs, refreshSongs } = require('./songs');
const fs = require('fs');
const stream = fs.createReadStream('./src/data/songs.jso')

const PORT = 4000;

const server = createServer(({ headers, method, url }, res) => {
  const baseResHeaders = {
    // CORS stuff is gone. :(
    'content-type' : 'application/json'
  };

  // Routing ¯\_(ツ)_ /¯
  //

  var path = url.parseUrl(url).pathname;

  function onRequest(request, response){
    response.writeHead(200, 'Content-Type': baseResHeaders['content-type']);
    stream.on('data', function(err, data){
      if (err) {
        response.writeHead(404);
        response.write('File not found');
        refreshSongs();
      } else {
        response.write(createGzip(data))
      }
      response.end()
    })
  }

  switch (path) {
    case '/songs':
      onRequest()
      break;
    case '/refresh-songs':
      onRequest()
      break;

  }

server.on('listening', () => {
  console.log(`Server running at http://localhost:${PORT}/`);
});

我想知道我是否正确连接了onRequest我创建的方法,以及 switch 语句是否正确地拦截了这些 URL

标签: javascriptnode.jsroutes

解决方案


推荐阅读