Javascript Express.js GET请求在第一次调用时不返回数据
我正在使用Node/Express/MongoDB构建一个应用程序(这是我第一次使用所有这些工具),它将允许我从数据库中提取数据并将其显示在Express页面上。这是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
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的副本-这是否回答了你的问题?如果是,请通过单击答案左侧的复选标记向社区指出。这也将为您在这里遵循正确的程序赢得一些声誉积分。如果没有,请说明尚未回答的问题。