gpt4 book ai didi

node.js - 在node.js上做一些认证后如何避免请求流数据丢失?

转载 作者:搜寻专家 更新时间:2023-10-31 23:14:05 25 4
gpt4 key购买 nike

请求流如何与 node.js 一起工作(express 或 restify)?

当客户端试图向服务器上传音频、mpeg 或其他二进制文件时,请求应该是服务器上的可读流。我们可以使用 request.pipe() 通过管道传输到另一个流中,例如从请求中获取文件,然后使用 knox 将文件上传到 amazon s3。

当我使用异步身份验证方法时,部分流式数据丢失并且长度不再与传输的 content-length header 匹配。有什么办法可以避免这种行为?请求流的数据是仅存储在内存中还是 node.js 将数据存储在某个本地临时文件夹中?

var express = require('express'),
app = express(),
passport = require('passport'),
BasicStrategy = require('passport-http').BasicStrategy;

var users = [
{ id: 1, username: 'bob', password: 'secret', email: 'bob@example.com' }
, { id: 2, username: 'joe', password: 'birthday', email: 'joe@example.com' }
];

function findByUsername(username, fn) {
for (var i = 0, len = users.length; i < len; i++) {
var user = users[i];
if (user.username === username) {
return fn(null, user);
}
}
return fn(null, null);
}

passport.use(new BasicStrategy(
function(username, password, done) {
process.nextTick(function () {
findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (user.password != password) { return done(null, false); }
return done(null, user);
})
});
}));

app.configure(function() {
app.use(express.logger());
app.use(passport.initialize());
app.use(app.router);
});

app.post('/upload',
passport.authenticate('basic', { session: false }),
function(req, res, next) {

var dataLength = 0;

req.on('data', function(chunk) {
console.log('loading');
dataLength += chunk.length;

}).on('end', function() {
console.log('load end');
console.log('contentLength: %s', req.headers['content-length']);
console.log('dataLength: : %s', dataLength);
res.send(200);

});
});

app.listen(8080, function() {
console.log('server is running');
});

最佳答案

让我们看看,从哪里开始:

  • 是的,请求是一个 ReadStream,它将如您所说发出 data 事件。
  • 流中的第一个数据 block 存储在内存中,没有临时文件。

您遇到的一般问题是您需要捕获从 req 发出的数据,并在身份验证完成后重新发出。 Connect 提供 helper 来为您做这件事。看起来 passport-http 目前没有使用它们。

如果安装 pause它可以为您处理这个模块。

尝试这样的事情:

var pause = require('pause');

// Create our own middleware constructor.
var bufferedAuthenticate = function(){
// Set up standard authenticate handler passing arguments through.
var authMiddleware = passport.authenticate.apply(passport, arguments);

// Pass our own middleware instead that wraps passport-http.
return function(req, res, next){
// Pause the request before authenticating.
var obj = pause(req);
authMiddleware(req, res, function(err){
next(err);

// Emit any cached data events that fired while authenticating.
obj.resume();
});
};
};

app.post('/upload',
bufferedAuthenticate('basic', { session: false }),
function(req, res, next) {
var dataLength = 0;

req.on('data', function(chunk) {
console.log('loading');
dataLength += chunk.length;

}).on('end', function() {
console.log('load end');
console.log('contentLength: %s', req.headers['content-length']);
console.log('dataLength: : %s', dataLength);
res.send(200);
});
}
);

关于node.js - 在node.js上做一些认证后如何避免请求流数据丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13412157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com