Вопрос:

nodejs: несколько запросов GET с неработающим async nano / express

node.js express async-await couchdb couchdb-nano

87 просмотра

1 ответ

139 Репутация автора

У меня странная ошибка с node.js и express, которая сводит меня с ума уже два дня.

Я хочу отобразить серию изображений в своем веб-приложении. Поэтому я отправляю запрос GET от клиента на мой экспресс-API, который затем должен доставить изображение.

Он прекрасно работает только с одним изображением на странице.

Однако, если я хочу отобразить серию изображений, скажем, 8 изображений, ТОЛЬКО ПОСЛЕДНЕЕ ИЗОБРАЖЕНИЕ БУДЕТ ОТКАЗАНО! Но порядок иногда меняется, иногда работает предпоследнее изображение, оно перетасовывается в совершенно случайном порядке!

Но это не только проблема с изображениями - это то же самое поведение со ВСЕМИ (асинхронными) запросами! Например, если я хочу отобразить некоторые имена пользователей в 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)
Автор: Kinesias Источник Размещён: 28.12.2017 09:10

Ответы (1)


0 плюса

139 Репутация автора

Решение

Я нашел решение - это ошибка, вызванная промежуточным программным обеспечением 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();
	})
});

Автор: Kinesias Размещён: 29.12.2017 08:26
32x32