2016-08-01 27 views
0

我有下面的代碼,我打開一個新的貓鼬連接插入記錄,但是當我嘗試關閉連接後forEach(應該是阻止),然後它執行mongoose.connection.close()inmediatly和不會在數據庫中插入任何記錄。任何想法如何做到這一點?如何在forEach執行後關閉mongoose連接?

這裏是我的代碼

'use strict'; 
const mongoose = require('mongoose'); 
const xlsx = require('node-xlsx'); 
const Model = require('./model'); 

mongoose.connect('mongodb://localhost:27017/exel', (err) => { 
    if (err) throw err; 
}); 

let obj = xlsx.parse(file); 
obj[0].data.forEach((item, index) => { 
    let newItem = { 
     nombre: item[2], 
     localidad: item[7], 
     cargo: item[8] 
    } 

    Model.create(newItem) 
    .then((createdItem) => { 
     console.log(createdItem); 
    }) 
    .catch((err) => { 
     console.log(err); 
    }); 
}); 

mongoose.connection.close(); 

我試圖創建與裏面在foreach代碼的功能並添加mongoose.connection.close()作爲回調,使用承諾,使用異步和其他幾個人,但沒有用。

+2

你誤會了節點如何以異步方式工作。然而,正如你聲明的那樣,'forEach'被阻塞了,然而,你會循環一切並調用'Model.create',它立即返回(它正在等待它的回調被觸發)。這意味着'mongoose.connection.close'會立即執行。嘗試查看每個循環的異步異步。 – MrWillihog

回答

1

您可以使用async

例如:

async = require("async"); 
async.each(items, function(item, callback){ 
    // Call an asynchronous function, often a save() to DB 
    item.someAsyncCall(function(){ 
     // Async call is done, alert via callback 
     callback(); 
    }); 
    }, 
    // 3rd param is the function to call when everything's done 
    function(err){ 
    // All tasks are done now 
    doSomethingOnceAllAreDone(); 
    } 
);