【问题标题】:How to assign a JSON object returned inside a promise object into a global variable?如何将 promise 对象中返回的 JSON 对象分配给全局变量?
【发布时间】:2020-11-15 06:06:54
【问题描述】:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;


const NewsAPI = require('newsapi');
const { response } = require('express');
const newsapi = new NewsAPI();

var current_date = new Date(Date.now());
var old_date = new Date(Date.now() - 864e5 - 864e5);

var current_date2 = JSON.stringify(current_date);
var old_date2 = JSON.stringify(old_date);

var today = current_date2.slice(1,11);
var day_b4_yesterday = old_date2.slice(1,11);

var feed;
newsapi.v2.everything({
    q: 'food and beverage',
    sources: '',
    domains: '',
    from: day_b4_yesterday,
    to: today,
    language: 'en',
    sortBy: 'relevancy',
    page: 2
}).then(response => {
    console.log(response);
    feed = response;

    

});


var NewsSchema = new Schema(feed);
module.exports = mongoose.model('News', NewsSchema);

我需要将作为由 newsapi 创建的 JSON 对象的响应分配给全局变量,以便在新架构中使用它。我怎么做?截至目前,我无法在全球范围内访问它。

我已按如下方式更改了我的代码,现在我可以访问它,但现在我遇到了架构配置错误。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;


const NewsAPI = require('newsapi');
const { response } = require('express');
const newsapi = new NewsAPI('87ca7d4d4f92458a8d8e1a5dcee3f590');

var current_date = new Date(Date.now());
var old_date = new Date(Date.now() - 864e5 - 864e5);

var current_date2 = JSON.stringify(current_date);
var old_date2 = JSON.stringify(old_date);

var today = current_date2.slice(1,11);
var day_b4_yesterday = old_date2.slice(1,11);


NewsLibrary = function(correct){
    var promise = new Promise(function(resolve, reject){
        if (correct){
            newsapi.v2.everything({
                q: 'food and beverage',
                sources: '',
                domains: '',
                from: day_b4_yesterday,
                to: today,
                language: 'en',
                sortBy: 'relevancy',
                page: 2
            }).then(response => {
                resolve(response);
            })
        }else{
            reject(new Error("Error loading news"))
        }
        

    });

    return promise;
}

NewsLibrary(true).then(function(response){
    console.log(response);
    var NewsSchema = new Schema(response);
    module.exports = mongoose.model('News', NewsSchema);
}).catch(function(err){
    console.log(err)
});

【问题讨论】:

标签: javascript node.js mongodb api mongoose


【解决方案1】:

您获取了一个全局变量feed。但是您将响应存储在window.feed 中。 所以你应该将它存储在then块中的feed变量中,这是第一件事。

【讨论】:

    【解决方案2】:

    你可以使用 global 或 GLOBAL 来分配它,nodejs 都支持:

    global.feed = 响应;

    GLOBAL.feed = 响应;

    【讨论】:

    • 当我尝试在 then 函数之外控制 feed 的值时,它使我返回 undefined。
    • 您是指提要本身还是 global.feed 值?
    【解决方案3】:

    我认为主要问题是因为该方法是异步的。

    var NewsSchema = new Schema(feed);
    

    此代码应仅在请求完成后才有效。但我认为它会在请求完成之前运行,因为它是在承诺之外给出的(then 语句)。

    理想情况下,您应该从该方法或函数返回一个承诺,该函数将返回正确的值并在导入 this 的模块中处理该承诺。一个例子是,

    
    var model = newsapi.v2.everything({
        q: 'food and beverage',
        sources: '',
        domains: '',
        from: day_b4_yesterday,
        to: today,
        language: 'en',
        sortBy: 'relevancy',
        page: 2
    }).then(response => {
        console.log(response);
        var NewsSchema = new Schema(response);
        return mongoose.model('News', NewsSchema);
    });
    
    
    module.exports = { model };
    
    

    你可以在需要这个的文件或方法中处理这个promise的解析。如果对更多异步代码感兴趣look here at MDN web docs

    【讨论】:

    • 我尝试了这个例子,但它抛出一个错误,指出模式尚未注册模型“新闻”。
    • 我在之前的代码中犯了一个错误已更正它请重试。请记住,要求此文件将返回一个承诺
    • 我实际上尝试了类似于您建议的相同错误。
    • var NewsSchema = newsapi.v2.everything({ q: 'food and beverage', sources: '', domains: '', from: day_b4_yesterday, to: today, language: 'en', sortBy: 'relevancy', page: 2 }).then(response => { console.log(response); return mongoose.model('News', new Schema(response)); }); module.exports = {NewsSchema} ;
    • 我对猫鼬的工作并不多。但是它不需要事先定义Schema。如果您需要在不了解架构的情况下进行惰性操作,请尝试 stackoverflow.com/questions/5370846/…。但在大多数情况下,您需要了解数据架构。
    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多