我一直在努力尝试这一点,尝试使用https://github.com/noffle/latest-tweets npm模块将我最新的推文作为数组发布。但是,无论我用什么方式订购它,都会出现某种形式的错误。主要职位未定义
或未定义推文。



var express = require('express');
var latestTweets = require('latest-tweets')
var Post = require('../models/blog');
var router = express.Router();


router.get('/', function (req, res) {
	Post.getPosts((err, posts) => {
		if(err){
			throw err;
		}
	});
	latestTweets('my_twitter_id', function (err, tweets) {
  	console.log(tweets)
	})
    res.render('index', {tweets : tweets, posts : posts});

});





我还尝试将LatestTweets函数导出到一个帮助器类中,这会导致更多问题。

最佳答案

在编写代码时,应注意变量的范围。 poststweets变量只能在将其作为参数传递的回调函数中访问,但是您要在它们的作用域之外访问它们。显然,由于参数tweets是在latestTweets的回调内传递的,因此变量tweets的局部作用域仅限于该回调。因此,当程序到达res.render时,它将尝试评估tweetsposts,但无法识别它们,并返回not defined。例

function myFunc(){
    var x = 0;
}
console.log(x);


上面的函数将返回相同的错误x is not defined,因为外部代码不知道x是什么。它是函数myFunc的本地变量,只能在函数内部访问。要使其可访问,必须将其设置为全局,即在主代码中声明var x = 0。在您的代码中,您能做的最好的事情就是在router.get函数的回调中声明两个变量(即,回调的全局变量),然后在各自的回调中将它们分配给poststweets

router.get('/', function (req, res) {
var tweets, posts;
Post.getPosts((err, posts) => {
    if(err){
        throw err;
    }
    posts = posts;
});
latestTweets('my_twitter_id', function (err, tweets) {
console.log(tweets)
tweets = tweets;
})
res.render('index', {tweets : tweets, posts : posts});

});


由于许多原因,使用sessions比在编写后端时声明变量更好的选择,这在这里可能无法解释,而且请避免使用嵌套回调。在这种情况下,在为全局变量res.rendertweets赋值之前,可能会调用posts,这将再次引发错误,表明tweetspostsundefined。在这种情况下,请使用Javascript的Promises(该语言自己的功能)来处理此类请求。

关于javascript - Node.js,“X”未定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41535448/

10-13 05:28