1

私はノード、マングース、エクスプレスを学んでいます。私はstackoverflowなどをすべて調べましたが、私の質問に対する答えはまだ見つかりません。

これは非常に初歩的な間違いだと確信しています。投稿されたデータを app.post 内に保存すると、node/express コードの他の場所にアクセスできなくなります。「ReferenceError: getUsersInfo が定義されていません」というエラーが表示されます。

var mongoose = require('mongoose');
mongoose = mongoose.createConnection('localhost', '27017');
mongoose.on('error', console.error.bind(console, 'connection error:'));
var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectID;

var usersSchema = new Schema({
    username: String,
    password: String, 
    email: String,
    date_created:{ type: Date, default: Date.now }
});

var users = mongoose.model('users', usersSchema);

app.get('/', function(req,res){
  res.render('layout.jade', { 
      title : "Hello!"
    ,analytics: 'XXXXXX'
  });
});

app.post('/', function(req, res){   
    var getUsersInfo = new users({
        username: req.body.user,
        password: req.body.password,
        email: req.body.email,
    });

    getUsersInfo.save(function (err, getUsersInfo) {
        if (err){throw err;}
        console.log(getUsersInfo.username);
        res.redirect("/success");
    });
});

app.get('/success', function(req, res){
    res.render('loggedin.jade', {
        title : "Admin Panel",
        analytics: 'XXXXXX'
    });

    var username = getUsersInfo("username");
    res.write("<h1> hi, " + username + "</h1>");

});

探す場所やコードを書くためのより良い方法など、あなたが私に与えることができる助けは大歓迎です。私は時代遅れのチュートリアルから学ぼうとしましたが、どこにも行きませんでした.mongoose api/docsはこのことをカバーしていないようです.

ありがとう!

編集
ここで達成しようとしていることを明確にするために、フォーム入力 (layout.jade ファイルでレンダリング) を取得し、それらをデータベースに保存します (これは で行っていますapp.post)。次に、コード内の他の場所にあるデータベース オブジェクトにアクセスできるようにしたいと考えていますapp.get('/success')。しかし、スコープの問題が発生し続けているようです。

4

1 に答える 1

0

nodejs/expressjs アプリケーションでは、ルート (など) はapp.getapp.postユーザーが対応する URL を要求したときに呼び出されるコールバック関数で設定されます。リクエストで実行する必要があるすべての操作は、これらのコールバック内から呼び出す必要があります。あなたの例では、でgetUsersInfo設定したコールバックの外部にアクセスしようとしていますapp.post。コードをコールバック内に移動すると、次のようになります。

app.post('/', function(req, res) {
    var getUsersInfo = new users({
        username: req.body.user,
        password: req.body.password,
        email: req.body-email
    });
    getUsersInfo.save(function(err, userinfo) {
        if(!err) {
            res.redirect('/success');
        }
        else {
            // Send error
        }
    });
});

編集:上記の回答は、コードのインデントによって混乱していました。これは今すぐ修正する必要があります。通常の Web アプリを作成しているように見えるので、sessionミドルウェアを確認することをお勧めします。これを開始する簡単な方法は、コマンドで高速アプリを生成することですexpress --sessions myapplication。これによりアプリケーションが設定され、req.sessionセッション スコープ オブジェクトを配置できるオブジェクトが作成されます。

app.post('/', function(req, res) {
   var getUsersInfo = new users({
        username: req.body.user,
        password: req.body.password,
        email: req.body-email
    });
    getUsersInfo.save(function(err, userinfo) {
        if(!err) {
            req.session.user = userInfo;
            res.redirect('/success');
        }
        else {
            // Send error
        }
    });
});

次に、あなたのapp.get

app.get('/success', function(req, res) {
    var user = req.session.user;
    // Do what you want with the user
});

REST アプローチを使用していた場合、リソースを保存してから取得するときの一般的なパターンはGET、作成されたリソースを取得する URL にリダイレクトし、リソースの識別子を含めることです。その場合、リダイレクトは次のようになります

res.redirect('/success/' + userInfo.id)

そして、次のようなルートを作成できます。

app.get('/success/:userId', function(req, res) {
    var user_id = req.param('userId');
    users.findById(user_id, function(err, user) {
        // user is available here. Add it to the template context and render it.
    });
});

:userIduriの構文は、userIdで使用できる という名前のパス変数を示しますreq.params

しかし、通常の Web アプリケーションを作成している場合は、セッション ミドルウェアを使用する最初のアプローチをお勧めします。

于 2013-03-31T00:10:40.513 に答える