javascript - 所有操作完成后返回响应nodejs

标签 javascript node.js

学习nodejs,如何在以下请求中返回完整响应?我似乎总是只检索到结果的快照。显然我在所有工作完成之前就回来了,请问有什么帮助吗?

  myapp.get('/someurl', (req, res) => {
      dbconn.connection.then((conn) => {
        conn.getdata().then((data) => {
          if (data != null) { 
            var foo = new foo();
            var result = [];
            for (var i = 0; i <= data.foos.length - 1; i++) {

              foo.Id = data.foos[i].myid;
              foo.name = data.foos[i].atamyname;
              foo.siblings = _.filter(data.foos, (fo) => {
                  if(fo.Id === data.foos[i].myid ){
                    return fo;
                  }
              });
              result.push(foo);
            }
            return result;
          }
        });
      });
    });

最佳答案

从外观上看,您在路由器中拥有此内容(可能是 express),并且第一行表明您正在处理 /someurl 的 GET 请求。请注意,第一个函数有 2 个参数:reqres。但您的代码没有使用它们,因此您可能不明白数据如何返回给调用者。

(req, res, next) 形式的函数称为中间件函数,参数具有特定用途:

  • req - 传入的 http 请求对象
  • res - 传出的 http 响应对象
  • next - 可用于告诉路由器继续或抛出错误

当您的函数收集了所需的数据后,您应该使用 res 对象将其发送回调用方。例如,如果您想返回带有一些数据的 JSON 对象,您的调用可能如下所示:

 myapp.get('/someurl', (req, res) => {
   return res.json({message: "it worked"});
 }

在您的情况下,您想要发回数据处理的结果,因此您可以将显示 return result; 的行替换为:

  return res.json(result);

这告诉 http 响应将 resultCode 设置为 200,并将响应 body 设置为 JSON 形式的 result 数组。

如果 JSON 不是您想要返回的格式,还可以使用其他 res 函数。请参阅Express documentation了解更多详情。

原始实现的问题是路由器不使用返回值。

此外,您还需要处理 data 以某种方式返回 null 的情况。也许可以使用 return res.status(404).end()return res.json([])

除此之外,您可能无法正确构建 result 数组。请注意,您创建了一个 foo 实例并不断将该对象推送到数组中。您应该每次通过循环创建一个新的 foo 对象,否则您将不断重复修改同一对象。试试这个:

if (data != null) { 
  var result = [];
  for (var i = 0; i <= data.foos.length - 1; i++) {
    var foo = new foo();  // <-- create a fresh one inside the loop
    foo.Id = data.foos[i].myid;
    foo.name = data.foos[i].atamyname;
    foo.siblings = _.filter(data.foos, (fo) => {
      if(fo.Id === data.foos[i].myid ){
        return fo;
      }
    });
    result.push(foo);
  }
  return res.json(result);
}

关于javascript - 所有操作完成后返回响应nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59910799/

相关文章:

javascript - 通过移动左边缘来调整谷歌地图的大小

node.js - Mongodb通过自定义id从 session 集合中查找结果

javascript - DiscordJS 如何编辑消息?

javascript - NodeJS Express 无法接收 POST json

javascript - 不知道为什么我的验证器不工作

javascript - 按函数名执行函数列表

node.js - 创建包含 TypeScript 中所有导出的模块

javascript - 使用 Node.js 和 mysql 表实现 Jade

javascript - “for 循环”和可能的语法错误

javascript - 在vuejs中重新渲染模板