Set giá trị language trong function Find mongose



  • Chào các bạn, mình mới học nodejs thì bị vướng chỗ gán giá trị vào function Find trong mongose, mong các pro chỉ giúp mình. Cám ơn các pro.
    Code mình ở dưới:

    • Mình muốn gán giá trị cho biến _language vào trong function tìm kiếm của Mongose, khi mình gán lại giá trị của nó trong function tìm kiếm lúc in ở trong function thì nó vẫn trả kết quả đúng. Nhưng in ra ở ngoài function thì nó báo null
    • Vậy cho mình hỏi có cách nào để mình set giá trị _language để in ở ngoài function đc ko ah ?
    • Cám ơn các pro.
    //connect database width mongoose-----------------------------------------------
    var mongoose = require('mongoose');
    mongoose.connect('localhost:27017/node_cms_database');
    var Schema = mongoose.Schema;
    //end connect database width mongoose-------------------------------------------
    
    //language----------------------------------------------------------------------
    var languageDataSchema = new Schema({    
            language_code: {type: String},
            language_name: {type: String},
            language_image: {type: String},
            language_status: {type: Number,default: 1},
            language_default: {type: Number},    
            language_sort: {type: Number}               
    }, {collection: 'language'});
    var LanguageData = mongoose.model('LanguageData', languageDataSchema);
    
    var _language = null;
    
    if (typeof session_language === "undefined" || session_language === null){  
        LanguageData.find({'language_default': 1},function (err, docs) {
            if(err){
                console.log(err);
            }else{
                  for (var k in docs) {
                    _language  = docs[k]['language_code'];  
                    //Chỗ này hiển thị đúng giá trị
                    //console.log(_language);              
                }                        
            }
        });      
    }
    // Chỗ này hiển thị là null, mình muốn giá trị set ở trong function hiển thị được ở đây
    console.log(_language);
    

  • Global Moderator

    Xin chào,

    Bạn đang gặp một vấn đề rất cơ bản của JavaScript, đó là xử lý hàm không đồng bộ, bạn chú ý là hầu hết hàm trong javascript/nodejs được xử lý bất đồng bộ. Nên các lệnh không được thực hiện theo thứ tự logic.

    Bạn tham khảo các vấn đề tương tự của bạn ở trên diễn đàn này nhé

    1. Thắc mắc nodejs (newbie), giống với tình huống của bạn
    2. Thắc mắc callback mong được giải đáp
    3. Vấn đề callback?
    4. Callback và Promise trong Async Function
    5. Chóng mặt việc xử lý đồng bộ rồi callback :(

    Sau khi bạn xem tất cả các vấn đề của mọi người gặp đều giống bạn và đều phải sửa lại code của mình. Và viết hàm ghi kết quả trong một hàm callback hoặc hàm then, khi gọi code không đồng bộ. Cụ thể ở đây bạn đang gọi hàm find của mongoose, cũng là một hàm xử lý không đồng bộ.

    Bạn có thể tìm hiểu thêm về vấn đề cơ bản này theo một vài hướng dẫn trên google nhé https://www.google.com.vn/search?q=xử+lý+không+đồng+bộ+javascript

    Tech-nông
    Twitter: @nhubaovu
    Profile: about.me/vunb

    0


  • Chào bạn,
    NodeJS chạy bất đồng bộ nên bạn để ngoài callback sẽ ko nhận được kết quả vì dòng lệnh console.log(_language); sẽ thực thi trước khi hàm .find thực thi xong. Có 3 cách:

    1. Bạn phải luôn nhận kq trong callback (cách bạn đang làm)
    2. Hoặc sử dụng thư viện async https://github.com/caolan/async
    3. Hoặc sử dụng ES6 syntax, cách này thì gần hơn với mong muốn của bạn. Support từ nodejs 6.9.x trở lên (ko nhớ rõ)
    var _language = null;
    let docs = yield LanguageData.find({'language_default': 1});
    _language  = docs[k]['language_code'];
    

    NHAN NGUYEN

    1


  • @Vũ
    Thanks !



  • @nguyenquynhan
    Thanks !


Log in to reply