【问题标题】:nodejs: multiple GET requests with async nano/express not workingnodejs:异步 nano/express 的多个 GET 请求不起作用
【发布时间】:2017-12-28 21:10:00
【问题描述】:

我在使用 node.js 和 express 时遇到了一个非常奇怪的错误,这让我已经疯了两天了。

我想在我的网络应用上显示一系列图像。因此,我从客户端向我的 express API 发送一个 GET 请求,然后它应该传递图像。

每页仅使用一张图片即可完美运行。

但是,如果我想显示一系列图像,比如说 8 张图像,则只渲染最后一张图像!但是顺序偶尔会发生变化,有时是倒数第二张图像有效,它会以完全随机的顺序洗牌!

但这不仅仅是图像的问题——所有(异步)请求的行为都是一样的! 例如,如果我想将一些用户名呈现到 iframe,我只获取最后一个 iframe 的数据,所有其他人都显示 mit 404 错误,无法获取。

这是我在前端的代码:

<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)

【问题讨论】:

  • 你为什么没有在sendFile()中传递任何参数?
  • 对不起,我复制粘贴了错误的代码。
  • 如果将var nano = _nano(...) 移出处理程序会发生什么?还有看看the tips here

标签: node.js express async-await couchdb couchdb-nano


【解决方案1】:

我找到了解决方案 - 这是由 nodejs 中间件“express-formidable”引起的错误。这个问题在这里讨论。 https://github.com/utatti/express-formidable/issues/6

只需使用“强大”的中间件就可以了。 这是我最终得到的代码。

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();
	})
});

【讨论】:

  • 你做过类似app.use(formidable()) 的事情吗?你能发布你的工作解决方案吗?我想看看..如果遇到类似问题,它可能对其他人有用
  • 只是避免使用“express-formidable”模块并使用原始“强大”模块。 “表达强大”是废话。
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2017-11-14
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多