2016-01-08 37 views
1

我目前使用Node.js,Mongoose和Express.js進行後端開發。這是我嘗試使用貓鼬創建的用戶列表。返回單個響應中的貓鼬錯誤列表

[ 
    { 
     "username" : "abc", 
     "password" : "123", 
     "displayname" : "ABC", 
     "email" : "[email protected]" 
    }, 
    { 
     "username" : "def", 
     "password" : "123", 
     "displayname" : "DEF", 
     "email" : "[email protected]" 
    }, 
    { 
     "username" : "ghi", 
     "password" : "123", 
     "displayname" : "GHI", 
     "email" : "[email protected]" 
    } 
] 

這就是我目前在後端做的事情。我將用戶名字段設置爲unique,如果其中一個用戶名已存在,貓鼬將返回錯誤。

var lists = req.body; 
lists.forEach(function(list) {  
    var user = new User();    
    user.username = list.username; 
    user.email = list.email; 
    user.displayname = list.displayname; 
    user.password = hashed(list.password); 
    user.save(function(err, user) { 
    if (err) { 
     console.log(list.username + ' is already registered.'); 
    } 
    }); 
}); 
res.json({ 
    message: 'Users are successfully created' 
}); 

我試圖返回在數據庫中已經存在的用戶列表,但我只是不能響應JSON做一個列表中console.log

abc is already registered. 
gef is already registered. 

有什麼方法可以處理它嗎?我無法保存user.save()內的值謝謝。

+0

[查看所有用戶(http://stackoverflow.com/questions/14103615/mongoose-get-full-用戶列表)並返回它們。有什麼大不了的? – nbro

回答

1

使用內置的承諾支持,而不是回調,這變得瑣碎Promise.all

Promise.all(lists.map(list => { // .all waits for an array of promises. 
    var user = new User();  // we `.map` which transforms every element of the array 
    user.username = list.username; 
    user.email = list.email; 
    user.displayname = list.displayname; 
    user.password = hashed(list.password); 
    return user.save().then(x => null,e => `${list.username} already reistered`); 
}).then(results => { // results of all save promises 
    const errors = results.filter(Boolean); // we mapped successes to null in the `then` 
    res.json(errors); // return all the errors 
});