node js自增id的问题

正派青年演员 2016-06-20 06:06:07
我在用node js+mongodb+express框架搭建一个博客网站,写了一个自增id,结果一直报这个错,不知道哪里有问题,请各位大神,帮忙看看。

自增id function
Ids.getId = function (tablename, callback) {
mongodb.open(function (err, db) {
if(err){
return callback(err);
}
db.collection('ids', function (err, collection) {
if(err){
return callback(err);
}
collection.findAndModify({"tablename":tablename}, [], {$inc:{'id':1}}, {new:true, upsert:true},function(err,doc){
mongodb.close();
if(err){
return callback(err);
}
/**
* doc:
*
* { lastErrorObject: { updatedExisting: true, n: 1 },
value: { _id: 57679a6e81c676eb4e32d869, tablename: 'bg_user', id: 21 },
ok: 1 }
*/
console.log(doc.value.id);
//return doc.value.id;
callback(doc);
});
});
});
};

调用获取id

app.post('/reg',function(req,res){
var username = req.body.name, password = req.body.password, password_re = req.body['password-repeat'];
if (password != password_re) {
req.flash('error', '两次输入的密码不一致!');
return res.redirect('/reg');
}
var email = req.body.email;
var userType = 2;//普通会员
var userId = Ids.getId('bg_user').id;
console.log('userId:'+userId);
var md5 = crypto.createHash('md5'), password = md5
.update(password).digest('hex');
var newUser = new User({
username : username,
password : password,
userType : userType,
email : email,
userId : userId
});
User.get(newUser.username, function(err, user) {
........


TypeError: callback is not a function
at E:\work\node\workspace\young\module\ids.js:84:15
at handleCallback (E:\work\node\workspace\young\node_modules\mongodb\lib\utils.js:96:12)
at Collection.find (E:\work\node\workspace\young\node_modules\mongodb\lib\collection.js:354:44)
at E:\work\node\workspace\young\module\ids.js:76:18
at handleCallback (E:\work\node\workspace\young\node_modules\mongodb\lib\utils.js:96:12)
at E:\work\node\workspace\young\node_modules\mongodb\lib\collection.js:1006:5
at commandCallback (E:\work\node\workspace\young\node_modules\mongodb-core\lib\topologies\server.js:936:9)
at Callbacks.emit (E:\work\node\workspace\young\node_modules\mongodb-core\lib\topologies\server.js:116:3)
at null.messageHandler (E:\work\node\workspace\young\node_modules\mongodb-core\lib\topologies\server.js:282:23)
at Socket.<anonymous> (E:\work\node\workspace\young\node_modules\mongodb-core\lib\connection\connection.js:273:22)
Program node app.js exited with code 1


是否还有其他方式实现自增id。

感谢!
...全文
432 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
正派青年演员 2016-06-24
  • 打赏
  • 举报
回复
@functionsub 非常感谢,学习了。
functionsub 2016-06-22
  • 打赏
  • 举报
回复
HTML标签的转码问题,涉及到安全问题,说起来就有点大了。 具体的你可以自己查询下XSS跨域攻击相关的资料。 不用你想的那么复杂的操作,我记得之前已经有人造过相关的轮子了,直接拿过来用吧。 无非就是对一些标签的过滤,对一些标签非法属性的过滤。 时间太久记不得相关的库名了,具体你自己查查相关资料吧。 最后,一般你这样的架构,都是有个模板库的,应该自带这样的功能的,你估计是没做相关的配置,所以模板文件自动将你的html标签解析成了纯文本,说到底就是对<、>、"、' 做了替换
functionsub 2016-06-21
  • 打赏
  • 举报
回复
var userId = Ids.getId('bg_user').id;
2,3年没关注node了,快忘差不多了。 就从代码层面上看,你上面这个getId方法,接受2个参数:tablename,callback 在这个方法里,你直接调用了callback方法,但是很明显,你使用的时候没有传入第二个参数callback。 所以你在getId方法里得判断callback是否是undefined
Ids.getId = function (tablename, callback) {
    mongodb.open(function (err, db) {
        if(err){
            return callback && callback(err);  // 加入callback是否为undefind的判断
        }
        db.collection('ids', function (err, collection) {
            if(err){
                return callback && callback(err); // 加入callback是否为undefind的判断
            }
            collection.findAndModify({"tablename":tablename}, [], {$inc:{'id':1}}, {new:true, upsert:true},function(err,doc){
                  mongodb.close();
                  if(err){
                     return callback && callback(err); // 加入callback是否为undefind的判断
                  }
                 /**
                  * doc:
                  * 
                  * { lastErrorObject: { updatedExisting: true, n: 1 },
                      value: { _id: 57679a6e81c676eb4e32d869, tablename: 'bg_user', id: 21 },
                      ok: 1 }
                  */
                  console.log(doc.value.id);
                 //return doc.value.id;
                            callback && callback(doc);      // 加入callback是否为undefind的判断
              });
        });
    });
};
最后,在我看来就算加上了callback判断,你这个getId方法也不行,这个方法没有返回值,你怎么可以Ids.getId('bg_user').id呢? 在我看来你下面调用的时候的代码都应该是放到getId的callback这个回调里。
正派青年演员 2016-06-21
  • 打赏
  • 举报
回复
@functionsub 非常感谢 你说的很对,调用的时候,需要把callback回调函数加进来,不然永远回调不到这个数据,永远是undefined. 非常感谢。 今天还碰到一个问题,添加日志内容的时候,加入html(比如链接)代码,数据库存储进去再解析回来的时候,显示的时候,这部分数据只能显示html代码块。 我想到的一种方法是,把html用某种文字格式的数据代替,然后,取出来后,再替换。 这样做好麻烦,不知道您有没有什么好的解决方法。

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧