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

时间:2020-01-25 15:43:17

标签: 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;
          }
        });
      });
    });

2 个答案:

答案 0 :(得分:1)

您尝试过以下吗?

return res.json(result);

答案 1 :(得分:1)

从事物的外观来看,您在路由器中拥有此功能(也许是express),第一行表示您正在处理GET/someurl的请求。请注意,第一个函数采用2个参数:reqres。但是,您的代码没有使用它们,因此您可能不了解如何将数据返回给调用方。

(req, res, next)形式的函数称为middleware函数,这些参数具有特定用途:

  • 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响应将JSON形式的resultCode设置为200,并将响应body设置为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);
}