Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express.js GET请求在第一次调用时不返回数据_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript Express.js GET请求在第一次调用时不返回数据

Javascript Express.js GET请求在第一次调用时不返回数据,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在使用Node/Express/MongoDB构建一个应用程序(这是我第一次使用所有这些工具),它将允许我从数据库中提取数据并将其显示在Express页面上。这是GET请求的外观: var str = ""; app.route('/view-reports').get(function(req, res) { var cursor = collections.find({}); cursor.each(function(err, item) { if

我正在使用Node/Express/MongoDB构建一个应用程序(这是我第一次使用所有这些工具),它将允许我从数据库中提取数据并将其显示在Express页面上。这是GET请求的外观:

var str = "";

app.route('/view-reports').get(function(req, res) {
  var cursor = collections.find({});

  cursor.each(function(err, item) {
    if (item != null) {
      console.log(str);
      str = str + "Substance: " + item.substance + "<br>";
    }
    if (err) {
      console.log(err);
    }
  });
  console.log(str);
  res.send(str);
  str = "";
});
var-str=”“;
app.route('/view reports').get(函数(req,res){
var cursor=collections.find({});
游标。每个(函数(错误,项){
如果(项!=null){
console.log(str);
str=str+“物质:”+item.Substance+“
”; } 如果(错误){ 控制台日志(err); } }); console.log(str); res.send(str); str=“”; });
我希望这会带来类似这样的结果:

app.route('/view-reports').get(function(req, res) {
  collections.find({}).toArray().then(data => {
      let result = data.map(item => {
          return "Substance: " + item.substance + "<br>";
      }).join("");
      res.send(result);
  }).catch(err => {
      // database error
      console.log(err);
      res.sendStatus(500);
  });
});
实质内容:a

物质:b

物质:c

但是,初始请求根本不返回任何内容。第二个请求将返回上述内容。如果我将res.send(str)括在If条件中,则在发出第二个请求之前,它不会加载。

游标。each()
是异步的。这意味着它有时会在您的
res.send(str)
之后运行,因此您将获得以前版本的
str
。您需要先收集所有数据,然后只有在拥有所有数据时才发送响应

如果您需要所有数据,那么可以使用Promissions和
.toArray()
,如下所示:

app.route('/view-reports').get(function(req, res) {
  collections.find({}).toArray().then(data => {
      let result = data.map(item => {
          return "Substance: " + item.substance + "<br>";
      }).join("");
      res.send(result);
  }).catch(err => {
      // database error
      console.log(err);
      res.sendStatus(500);
  });
});
app.route('/view reports').get(函数(req,res){
collections.find({}).toArray().then(数据=>{
让结果=data.map(项=>{
返回“物质:+item.Substance+”
”; }).加入(“”); res.send(结果); }).catch(错误=>{ //数据库错误 控制台日志(err); res.sendStatus(500); }); });

注意:这也明智地消除了
str
变量,该变量不在请求范围内,因此当多个请求同时进行时(来自不同用户),很容易导致并发错误。

创建一个专门用于物质的路由器,并在应用程序中使用它。您可以创建一个ul,而不是中断,该处理也应该发生在前端。分开你的顾虑。服务器不必担心任何渲染等问题。每个进程有一个目的

路由器可以按资源创建。为物质、猫、狗创建路由器。每个路由器都有自己的get post delete和puts,允许您修改该资源<代码>应用程序可以同时使用所有路由器

app.use(有线路由器);
应用程序使用(mooseRouter);
应用程序使用(鸭嘴兽路由器)

const{Router}=require('express');
const createError=require('http-errors');
let substanceRouter=新路由器();
函数构建元素(arr)
{
让我们开始=“”;
arr.forEach(val=>{
如果(!val)返回;
start+=`物质:${val}
`; }); 返回启动; } subtanceRouter.get('/endpoint/whatever',函数(req、res、next){ collectios.find({}) 。然后(结果=>{ 如果(!results)抛出新错误('Resource Not Found'); 让输出=buildElement(结果); res.json(输出); next(); }) .catch(err=>next(createError(404,err.message)); })
应用程序使用(实体外部)光标的可能重复项。每个()都是异步的。这意味着它有时会在你的
res.send(str)
之后运行,因此你会得到以前版本的
str
。可能是@gabrielmorris的副本-这是否回答了你的问题?如果是,请通过单击答案左侧的复选标记向社区指出。这也将为您在这里遵循正确的程序赢得一些声誉积分。如果没有,请说明尚未回答的问题。