Tag: expression

在Express / Node中使用sendFile时发生随机'ECONNABORTED'错误

我已经用Express中间件设置了一个节点服务器。 当加载一个触发大约10个其他负载(js,css等)的HTML文件时,我会在某些文件上随机获取ECONNABORTED错误。 确切的错误是: { [Error: Request aborted] code: 'ECONNABORTED' } 由这个简化代码生成(在我尝试debugging问题之后): res.sendFile(res.locals.physicalUrl,function (err) { if (err) console.log(err); … } 很多post都提到由于没有指定完整path名而导致的这个错误。 这不是这里的情况。 我确实指定了完整的path,而且错误是随机生成的。 有时候,页面及其后面的所有链接都可以完美加载,有时甚至没有。 我试图刷新caching,并没有find任何模式来连接它与此。 这个特定的错误似乎是套接字连接中止的一个通用术语,并在其他应用程序(如FTP)的上下文中讨论。 意识到节点工作线程可以增加,我试图这样做使用: process.env.UV_THREADPOOL_SIZE = 20; 然而,我的理解是,即使没有这个,最多文件传输可能不得不等待一个工作线程是免费的,不会被中止。 我不是在这里谈论大文件,所有文件都小于1 MB。 我有一个直觉,这与节点直接无关。 请指出任何其他的可能性(节点或其他)来处理这个错误。 另外还有其他的间接解决scheme吗 重试几次可能是一个,但这将是笨拙的。 编辑:不,我不能重试。 标题已经发送错误! 一边注意:许多使用sendFile的示例跳过使用callback,从而给人的印象是一个同步调用。 不是这样。 请始终使用callback,检查是否成功,然后才能转到“下一个”中间件,或者如果发送失败,采取适当的步骤。 如果不这样做,可能会使debuggingasynchronous环境中的后果变得困难。

是否有任何框架在NodeJS中创build适当的REST(即超媒体)接口?

我有点不知所措的框架或expression/连接中间件的数量,声称他们提供REST支持,但实际上更多关于“自动CRUD” 是否有任何示例显示返回框架形成超链接到其他资源的响应? 例如,考虑 /comments 在哪里我可以发布消息。 在我坚持评论之后,客户端可以从中检索 /comment/:id …但理想情况下,我想要从评论集合资源(以及许多其他的URI来满足HATEOAS)返回创build的评论的实际URI,一个POST POST然后GET …当然,这是不可能的,如果你很乐意把string连接放在所有的地方。 在玩过Ember之后,我希望有类似于处理路由的方式 ,但是在服务器端,我可以简单地用内部名称来引用路由/资源,并将URI模板留给路由器。 那有意义吗? 这是可能的,我可怕地忽略了它?

saveUninitialized和resave有什么区别?

Express会话中间件提供了几个可configuration的选项 。 resave :'强制会话保存回会话存储区,即使会话在请求期间从未被修改。 saveUninitialized :'强制将未初始化的会话保存到商店。 当一个会话是新的,但没有被修改时,会话是未初始化的。 看来,这两个选项都是为了保存未修改的会话。 有什么不同?

循环内asynchronous调用

可能重复: 在node.js中协调并行执行 首先,手上伪代码: forEach(arrayelements) { asyncQueryFunction(function(qres) { //work with query results. }); } // finally, AFTER all callbacks did return: res.render("myview"); 怎么做? 如果这还不够清楚,我会解释一下: 我需要做一系列的“更新”查询(在mongodb中,通过mongoose),循环的文档ID列表。 对于我的数组中的每个id我将调用一个asynchronous函数,将返回查询结果(我不需要做任何事情,实际上)。 我知道我必须使用.forEach() JavaScript循环,但是只有当我的所有asynchronous查询完成后,我怎样才能执行我的“最终”callback? 我已经使用优秀的asynchronous库( https://github.com/caolan/async )来实现这种任务,当我有一个“有限”的一系列任务执行。 但我不认为我可以通过它一系列不同的function。 我可以吗?

Node.JS中的HTTP DELETE动词

在我可以向一个node.js应用程序发出DELETE请求之前,是否需要设置任何configuration? 我可以做GET , POST或者PUT请求,但是DELETE请求不起作用。 DELETE http://localhost:8081/api/1.0/entry从路由logging器中得到undefined ,我使用express来注册路由。 但它看起来像我甚至无法解决的url/动词。 这是我如何调用它: rows.find('a.remove').on('click', function(){ $.ajax({ url: '/api/1.0/entry', type: 'DELETE' }).done(function(res){ var row = $(this).parentsUntil('tbody'); row.slideUp(); }); }); 示例日志 GET / 200 18ms GET /author/entry 200 10ms GET /api/1.0/entry 200 2ms GET /api/1.0/entry 200 1ms GET /api/1.0/entry 200 1ms undefined

Morgan Logger + Express.js:写入文件并在控制台中显示

我试图用Express.js和Morgan一起在控制台上显示我的日志的同时写一个日志文件。 我正在使用这个代码: var logger = require('morgan'); var accessLogStream = fs.createWriteStream('./access.log', {flags: 'a'}); app.use(logger("dev",{stream: accessLogStream})); 但是这样我只能得到控制台日志,而我的access.log文件仍然是空的。 如果我这样做,而不是(指定“开发”): var logger = require('morgan'); var accessLogStream = fs.createWriteStream('./access.log', {flags: 'a'}); app.use(logger({stream: accessLogStream})); 我得到我的文件日志,但不是在控制台上。 我怎样才能获得控制台上的日志和文件? 先谢谢你! 编辑:在这一刻我已经find了这个解决scheme: app.use(logger({format:"[:date[clf]] :method :url :status :response-time ms",stream: { write: function(str) { accessLogStream.write(str); console.log(str); } }})); 但如果你有一个更好的…不客气!

Express SessionID与Cookie中的SessionID不同

我有一个相应的问题,使用给出的例子。 在这个例子中,会话在WebSocket中被使用,首先重载: socket.on('set value', function (val) { sess.reload(function () { sess.value = val; sess.touch().save(); }); }); 试图在我自己的应用程序中使用它,我得到以下exception: sess.reload(function () { ^ TypeError: Object #<Object> has no method 'reload' 我认为问题是,没有人将variablessess定义为会话: io.listen(app).set('authorization', function (data, accept) { if (!data.headers.cookie) return accept('No cookie transmitted.', false); data.cookie = parseCookie(data.headers.cookie); data.sessionID = data.cookie['express.sid']; store.load(data.sessionID, function (err, session) { if (err || […]

将zip文件解压到本地文件夹

我有节点应用程序快递和即时消息发送来自客户端的请求,如邮递员,我需要从请求获取文件,并提取它在我的本地文件夹,我怎么能做到这一点? 我发现以下开源,但不知道如何把req正文,并提取它在我的本地文件夹,如“C:// Test // extractDest”, 下面的代码是从以下开源获取的,但如果有其他好的开源的,我可以用它来代替 https://www.npmjs.com/package/decompress-zip var DecompressZip = require('decompress-zip'); var unzipper = new DecompressZip(filename) unzipper.on('error', function (err) { console.log('Caught an error'); }); unzipper.on('extract', function (log) { console.log('Finished extracting'); }); unzipper.on('progress', function (fileIndex, fileCount) { console.log('Extracted file ' + (fileIndex + 1) + ' of ' + fileCount); }); unzipper.extract({ path: "C://Test//extractDest", filter: function […]

如何使用joi(Node.js的validation框架)validation对象的数组?

我得到一个对象数组到后端,其中每个对象包含一个服务名称。 结构如下所示 [{"serviceName":"service1"}, {"serviceName":"service2"},..] 当我在后端得到数组时,我想validation数组中的每个对象都具有serviceName属性。 我已经写了下面的代码,但即使我传递有效的数组,我得到validation错误。 var Joi = require('joi'); var service = Joi.object().keys({ serviceName: Joi.string().required() }); var services = Joi.array().ordered(service); var test = Joi.validate([{serviceName:'service1'},{serviceName:'service2'}],services) 对于上面的代码,我总是得到消息的validation错误 "value" at position 1 fails because array must contain at most 1 items

我可以通过express next()函数发送数据吗?

我正在开发一个需要进行身份validation和会话pipe理的web应用程序。 我已经完成了后端会话的东西。 现在我想在UI上显示login的用户。privateContent是一个validation用户是否login的function,如下所示: … app.get( '/authRequired', queries.privateContent , routes.tasks ); … 这里是queries.privateContent: … exports.privateContent = function ( req, res, next ) { if ( req.session.user ) { var username = req.session.user.username; User.findOne( { 'username': username }, function ( err, obj ) { if ( true ) { next(); } else { res.redirect('/'); } }); } […]