nodejs:异步 nano/express 的多个 GET 请求不起作用
nodejs: multiple GET requests with async nano/express not working
我在 node.js 和 express 上遇到了一个超级奇怪的错误,这让我抓狂了两天。
我想在我的网络应用程序上显示一系列图像。因此,我从客户端向我的 express API 发送 GET 请求,然后它应该传送图像。
每页只有一张图片,效果很好。
但是,如果我想显示一系列图像,比如说 8 张图像,则只渲染最后一张图像!但是顺序有时会发生变化,有时是倒数第二张图片有效,它正在以完全随机的顺序打乱!
但这不仅仅是图像的问题——所有(异步)请求的行为都是一样的!
例如,如果我想将一些用户名呈现给 iframe,我只获取最后一个 iframe 的数据,所有其他 iframe 显示 404 错误 CANNOT GET。
这是我在前端的代码:
<iframe src="http://127.0.0.1:3000/files/bigThumb/file-version-2017-12-27T11-53-45-647Z-3DnsDX?projectdb=cdu_regierung&companydb=cdu&authsession=supersecrettoken"></iframe>
<iframe src="http://127.0.0.1:3000/files/bigThumb/file-version-2017-12-27T13-08-58-189Z-q52KKd?projectdb=cdu_regierung&companydb=cdu&authsession=supersecrettoken"></iframe>
<iframe src="http://127.0.0.1:3000/files/bigThumb/file-version-2017-12-27T13-08-58-189Z-q52KKd?projectdb=cdu_regierung&companydb=cdu&authsession=supersecrettoken"></iframe>
<iframe src="http://127.0.0.1:3000/files/bigThumb/file-version-2017-12-27T13-08-58-189Z-q52KKd?projectdb=cdu_regierung&companydb=cdu&authsession=supersecrettoken"></iframe>
这是我在服务器端的代码
app.all('/files/:action/:versionId', async function(req, res) {
try {
var projectName = req.query.projectdb;
var companyName = req.query.companydb;
var authSession = req.query.authsession;
var nano = _nano({url: 'http://127.0.0.1:5984/', cors: true, cookie: 'AuthSession='+ authSession});
var session = await nano.session();
session = session[0];
var username = session.userCtx.name;
res.send(username);
} catch(err) {
return res.status(401).send(err);
}
})
我的猜测是它与
中的 ASYNC 函数有关
app.all('/files/:action/:versionId', async function(req, res) {
因为我从来没有遇到过标准同步功能(req,res)的问题
我做错了什么??
编辑
我在下面的这段代码中遇到了同样的问题。
app.all('/files/:action/:versionId', function(req, res) {
request('https://jsonplaceholder.typicode.com/posts/1', function (error, response, body) {
res.send(body);
});
它可以完美地处理 1 个 GET,但不能处理 8 个同时的 GET 请求。另外,我在日志中收到此错误:
_http_outgoing.js:494
throw new Error('Can\'t set headers after they are sent.');
Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:494:11)
我找到了解决方案 - 这是一个由 nodejs 中间件引起的错误 "express-formidable"。这个问题在这里讨论。
https://github.com/utatti/express-formidable/issues/6
只需使用 "formidable" 中间件即可。
这是我最终得到的代码。
var formidable = require('formidable');
// init formidable middleware
app.use(function (req, res, next) {
var form = new formidable.IncomingForm({
encoding: 'utf-8',
multiples: false,
keepExtensions: true,
})
form.once('error', console.log)
form.parse(req, function (err, fields, files) {
Object.assign(req, {fields, files});
next();
})
});
我在 node.js 和 express 上遇到了一个超级奇怪的错误,这让我抓狂了两天。
我想在我的网络应用程序上显示一系列图像。因此,我从客户端向我的 express API 发送 GET 请求,然后它应该传送图像。
每页只有一张图片,效果很好。
但是,如果我想显示一系列图像,比如说 8 张图像,则只渲染最后一张图像!但是顺序有时会发生变化,有时是倒数第二张图片有效,它正在以完全随机的顺序打乱!
但这不仅仅是图像的问题——所有(异步)请求的行为都是一样的! 例如,如果我想将一些用户名呈现给 iframe,我只获取最后一个 iframe 的数据,所有其他 iframe 显示 404 错误 CANNOT GET。
这是我在前端的代码:
<iframe src="http://127.0.0.1:3000/files/bigThumb/file-version-2017-12-27T11-53-45-647Z-3DnsDX?projectdb=cdu_regierung&companydb=cdu&authsession=supersecrettoken"></iframe>
<iframe src="http://127.0.0.1:3000/files/bigThumb/file-version-2017-12-27T13-08-58-189Z-q52KKd?projectdb=cdu_regierung&companydb=cdu&authsession=supersecrettoken"></iframe>
<iframe src="http://127.0.0.1:3000/files/bigThumb/file-version-2017-12-27T13-08-58-189Z-q52KKd?projectdb=cdu_regierung&companydb=cdu&authsession=supersecrettoken"></iframe>
<iframe src="http://127.0.0.1:3000/files/bigThumb/file-version-2017-12-27T13-08-58-189Z-q52KKd?projectdb=cdu_regierung&companydb=cdu&authsession=supersecrettoken"></iframe>
这是我在服务器端的代码
app.all('/files/:action/:versionId', async function(req, res) {
try {
var projectName = req.query.projectdb;
var companyName = req.query.companydb;
var authSession = req.query.authsession;
var nano = _nano({url: 'http://127.0.0.1:5984/', cors: true, cookie: 'AuthSession='+ authSession});
var session = await nano.session();
session = session[0];
var username = session.userCtx.name;
res.send(username);
} catch(err) {
return res.status(401).send(err);
}
})
我的猜测是它与
中的 ASYNC 函数有关app.all('/files/:action/:versionId', async function(req, res) {
因为我从来没有遇到过标准同步功能(req,res)的问题
我做错了什么??
编辑 我在下面的这段代码中遇到了同样的问题。
app.all('/files/:action/:versionId', function(req, res) {
request('https://jsonplaceholder.typicode.com/posts/1', function (error, response, body) {
res.send(body);
});
它可以完美地处理 1 个 GET,但不能处理 8 个同时的 GET 请求。另外,我在日志中收到此错误:
_http_outgoing.js:494
throw new Error('Can\'t set headers after they are sent.');
Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:494:11)
我找到了解决方案 - 这是一个由 nodejs 中间件引起的错误 "express-formidable"。这个问题在这里讨论。 https://github.com/utatti/express-formidable/issues/6
只需使用 "formidable" 中间件即可。 这是我最终得到的代码。
var formidable = require('formidable');
// init formidable middleware
app.use(function (req, res, next) {
var form = new formidable.IncomingForm({
encoding: 'utf-8',
multiples: false,
keepExtensions: true,
})
form.once('error', console.log)
form.parse(req, function (err, fields, files) {
Object.assign(req, {fields, files});
next();
})
});