2017-01-08 19 views
0

私は最新のつぶやきをhttps://github.com/noffle/latest-tweets npmモジュールの配列として取得しようとしています。しかし、私はそれを注文するように見えても、何らかの形のエラーが出ます。主に投稿が定義されていません またはツイートが定義されていません。Node.js、 'X'は定義されていません

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

 

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

 
});

私はまた、より多くの問題につながるヘルパークラスにlatestTweets機能をエクスポートしようとしました。

答えて

0

コードを書くときに変数のスコープを処理する必要があります。 postsおよびtweets変数は、引数として渡されるコールバック関数内でのみアクセス可能ですが、スコープ外でアクセスしています。明らかに、引数tweetsはコールバックlatestTweetsの中で渡されるので、変数tweetsにはコールバックに限定されたローカルスコープがあります。したがって、プログラムがres.renderに達すると、tweetspostsを評価しようとし、それらを識別できず、not definedを返します。外側のコードはxが何であるかを知らないので、

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

上記の関数は、同じエラーx is not definedを返します。これは関数myFuncに対してローカルであり、内部でのみアクセス可能です。アクセシブルにするには、メインコードにvar x = 0と宣言して、グローバルにする必要があります。
コードでは、router.get関数のコールバック(つまり、コールバックに対してグローバル)内に2つの変数を宣言し、それぞれのコールバックでpoststweetsに割り当てます。 sessionsを使用して

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}); 

}); 

があるため、ここで説明するのオフトピックだろう理由から、多くのの、バックエンドの書き込み中に、変数を宣言するよりも良い選択肢です。

また、ネストされたコールバックを使用しないでください。この場合、グローバル変数tweetsおよびpostsに値が割り当てられる前にres.renderが呼び出され、tweetsおよびpostsのエラーが再び返され、undefinedとなる可能性があります。そのような場合は、そのような要求を処理するための言語固有の機能であるJavascriptのPromisesを使用してください。

1

投稿とツイートの両方がコールバックの変数です。 コールバックの外部では使用できません。

クイックフィックス:

router.get('/', function (req, res) { 
    Post.getPosts((err, posts) => { 
     if(err){ throw err; } 

     latestTweets('my_twitter_id', function (err_, tweets) { 
      if(err_){ throw err_; } 
      console.log(tweets); 

      res.render('index', {tweets : tweets, posts : posts}); 
     }); 
    }); 
}); 

あなたがきれいに解決策を探しているなら、あなたは非同期モジュールを見てみることができます。 async repo

+1

ありがとうございました。上記の修正プログラムを実行しましたが、タイプミス:Pですが、単に空の配列を返します。 iveは他の試みでアレイをコンソールログにパースして成功しましたが、私のルートには決して行きませんでした。私はあなたが合気道の –

+1

の愚かな私は正しい私の正しいツイッターIDにユーザー名を変更しませんでした。そのため、空の配列が発生しました。 –

関連する問題