NodeJS Express,添加交易标识
民间, 尝试为每个API调用设置交易ID。以下作品:NodeJS Express,添加交易标识
var cls = require('continuation-local-storage');
var uuid = require('node-uuid');
var namespace = cls.createNamespace('foo');
var tokenMiddleware = function tokenMiddleware(req, res, next){
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(function() {
namespace.set('tid', tid);
next();
});
};
现在,当我尝试添加的附加信息(从蒙戈返回),它失去了语境:
var cls = require('continuation-local-storage');
var uuid = require('node-uuid');
var namespace = cls.createNamespace('foo');
var tokenMiddleware = function tokenMiddleware(req, res, next){
mongo.fetchId(authId, function (result) {
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(function() {
namespace.set('tid', tid);
namespace.set('somethingfromDB',result.something);
next();
});
});
};
交易ID不可再往下,其不确定...第一个例子如何工作,第二个例子不工作?
我在做什么错?我怀疑问题必须在next()上下文中做些什么。 Express v4。
谢谢!
我一直在使用快递有类似的问题。据我所知,mongo模块会覆盖请求和响应函数。一旦你在数据库调用中,你会发现这些对象不再是你期望的那样。我的解决方案是将其分成两个独立的函数,它们允许您明确地将它们传递给db函数。
var tokenMiddleware = function tokenMiddleware(req, res, next){
var callDB = function (req, res, namespace) {
mongo.fetchId(authId, function (result) {
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(function() {
namespace.set('tid', tid);
namespace.set('somethingfromDB',result.something);
next();
});
});
});
callDB(req, res, namespace)
};
mongo如何覆盖该函数的局部变量? – Bergi 2014-09-29 00:46:29
我不完全确定,但我相信它与臭名昭着的'这个'以及它所引用的有关。在mongo函数集中,与express函数中的含义完全不同。在mongo调用中,这将是mongo db对象,因此set()是一个不同的函数,并且响应对象不能调用它。通过传入对象,您可以将原型函数一起发送,从而维护一个可以在其上调用的set()函数。 – beaglebets 2014-09-29 01:34:00
当使用'mongoose'我根本没有看到这个问题。你的回答很可能是正确的。当我验证时,会接受。谢谢! – Cmag 2014-09-29 04:27:51
尝试在promise中设置SomethingfromDB。 参考 https://www.promisejs.org/ 或尝试somethingfromdb设置
var cls = require('continuation-local-storage');
var uuid = require('node-uuid');
var namespace = cls.createNamespace('foo');
var tokenMiddleware = function tokenMiddleware(req, res, next){
mongo.fetchId(authId, function (result) {
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(function() {
namespace.set('somethingfromDB',result.something);
namespace.set('tid', tid);
next();
});
});
};
希望以后分配TID这有助于
请参阅https://www.promisejs.org/ – 2014-09-25 12:50:00
此代码使用承诺在哪里? – Bergi 2014-09-29 00:44:36
我说你可以用promises – 2014-09-29 12:30:15
tid在哪里定义? – DrakaSAN 2014-09-25 08:10:27
'result'对象确实拥有'something'属性吗? – 2014-09-25 12:37:07
这里的评论建议你也许应该发布一个完整的代码示例。我的意思是一个最小的快速/ mongo设置。 – nha 2014-09-25 19:03:38