Node.js ログイン API が誤解により予期しない動作を示していますPromise が非同期操作とどのように相互作用するかについて説明します。それぞれの問題に対処しましょう:
findUser() 関数が Promise を返しません。代わりに、データベース クエリは非同期であり、実行に時間がかかるため、すぐに unknown が返されます。これを修正するには、クエリが完了したときに呼び出されるコールバック関数を query() メソッドに渡す必要があります:
me.findUser = function(params, res) { var username = params.username; return new Promise(function (resolve, reject) { pool.getConnection(function (err, connection) { if (err) { reject(err); } else { connection.query('select ...', [username], function (err, rows) { connection.release(); if (!err) { resolve(rows); } else { reject(err); } }); } }); }); }
Promise の拒否() メソッドが呼び出されないため、エラー ハンドラーはトリガーされません。コードでは、エラーが発生したときにデータベース クエリのコールバックから false を返します。代わりに、次のエラーを含む Promise を拒否する必要があります:
me.findUser = function(params, res) { // ... return new Promise(function (resolve, reject) { // ... connection.query('...', [username], function (err, rows) { connection.release(); if (!err) { resolve(rows); } else { reject(err); } }); }); }
ここに、ログイン ルート ファイルの修正バージョンがあります。 Promise を適切に使用します:
module.exports = function(app) { app.post('/login/', async function(req, res, next) { try { // Find user in database var rows = await loginM.findUser(req.body, res); // Do something with the data var result = await loginC.doSomething(rows); console.log("Success"); } catch (err) { console.log("Failed: " + err.message); } }); }
Promise を使用すると、ログイン API の各ステップが順番に実行されるようになります。 await キーワードを使用すると、コードは先に進む前に Promise が解決されるまで待機し、次のステップが前のステップのデータに確実にアクセスできるようにします。さらに、try/catch を使用すると、プロセス中に発生する可能性のあるエラーを処理できます。
以上がNode.js ログイン API が Promise で機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。