2016-05-06 81 views
0

一個model.js文件中包含該型號:查詢sequelizejs返回undefined

exports.Conversations = db.sequelize.define('conversations', { 
room_id: {   
    type: db.Sequelize.STRING 
},       
user_id: { 
    type: db.Sequelize.STRING 
}, 
friend_id: { 
    type: db.Sequelize.STRING 
}, 
}, { 
timestamps: true, 
createdAt:'created_at', 
updatedAt:'updated_at', 
deletedAt:'deleted_at', 
freezeTableName: true // Model tableName will be the same as the model name 
}); 

在query.js我有以下功能:

exports.checkRoom = function(user_id,friend_id) { 
models.Conversations.findOne({ where: { $or: [{user_id: user_id , friend_id: friend_id}, {user_id: friend_id , friend_id: user_id}] }}).then(function(conversation) { 
    return conversation; 
}); 
} 

等同於:

SELECT 
    "id", "room_id", "user_id", "friend_id", "created_at", "updated_at" 
FROM 
    "conversations" AS "conversations" 
WHERE 
    (("conversations"."user_id" = '127' AND "conversations"."friend_id" = '124') 
    OR ("conversations"."user_id" = '124' AND "conversations"."friend_id" = '127')) 
LIMIT 1; 

當我在我的cluster.js

var conversation = query.checkRoom(data.userId,data.friendId)); 

我得到的那個對話是未定義的。

找到了幾個解決方案來抓住對象Promise但沒有奏效。

期待您的回答。

編輯

沒做到這一點,但調用我想這個問題的答案添加到一個變種,所以我可以在以後用它查詢時。如果現在我正在做類似的變化

conversationId = query.checkRoom(data.userId, data.friendId).then(function(conversation) { return conversation.dataValues.id; }) 

我得到我的var對話Id是[object promise]。

我怎樣才能獲得和使用外的.then()函數的承諾?

回答

0

您試圖使用checkRoom()作爲同步函數,它不是(像大多數處理Node中I/O的函數一樣)。

相反,你應該findOne()返回返回的承諾和處理這一承諾的解決(和拒絕)在您的調用代碼:

// query.js 
exports.checkRoom = function(user_id, friend_id) { 
    return models.Conversations.findOne({ where: { $or: [{user_id: user_id , friend_id: friend_id}, {user_id: friend_id , friend_id: user_id}] }}); 
} 

// calling code 
query.checkRoom(data.userId, data.friendId).then(function(conversation) { 
    // do something with the database result 
    ... 
}) 
+0

謝謝你的答案。管理這樣做,但在調用查詢時,我想將該答案添加到var,以便稍後使用它。 如果現在我真的做這樣的事情 VAR的conversationId = query.checkRoom(data.userId,data.friendId)。然後(功能(通話){ 回報conversation.dataValues.id; }) 我得到的我的var conversationId是[object Promise] – Edu

+0

@Edu即使這些回調被用作承諾解析處理程序,您也無法從異步回調中返回標量值。 – robertklep

+0

在這種情況下,你會想到什麼樣的轉變? – Edu