async.waterfall 不同步

async.waterfall not acting synchronously

我正在尝试使用加密写一个 header 的 MD5 哈希令牌,然后 return 它作为响应返回。出于某种原因,它实际上并不是 运行 同步的。我知道 JS 是一种异步语言,而这确实是我目前正在努力解决的唯一部分。任何帮助将不胜感激。

这是我目前拥有的:

const crypto = require('crypto');
const bodyParser = require('body-parser');
const formidable = require('formidable');
const async = require('async')

app.post('/pushurl/auth', (req, res) =>
    var data = req.body.form1data1 + '§' + req.body.form1data2 
        

    async.waterfall([
            function(callback) {
                var token = crypto.createHash('md5').update(data).digest("hex");
                callback(null, token);
            },
            function(token, callback) {
                res.writeHead(301,
                    {Location: '/dashboard?token=' + token}
                );
                callback(null)
            },
            function(callback) {
                res.end();
                callback(null)
            }
        ]);
        
    }
});

输出:

Uncaught Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
<node_internals>/internal/errors.js:256
    No debugger available, can not send 'variables'
Process exited with code 1

JavaScript是一种异步语言,是的,但它也可以很好地完成同步任务。在你的情况下,如果你正在处理承诺,你不需要做任何异步期望。

如果您像下面的示例一样编写代码,它将从上到下执行。

但错误(可能)发生是因为您忘记在 app.post 回调中添加左花括号,这导致 data var 立即被 returned 因为隐含的 return 语句 () => (隐含),() => {}(显式)。

const crypto = require('crypto');
const bodyParser = require('body-parser');
const formidable = require('formidable');

app.post('/pushurl/auth', (req, res) => {

  const data = req.body.form1data1 + '§' + req.body.form1data2;
  const token = crypto.createHash('md5').update(data).digest("hex");
  res.writeHead(301, {
    Location: '/dashboard?token=' + token
  });
  res.end();
        
});