ฉันเห็นการใช้งานจำนวนมากnext
ใน node.js
มันมาจากไหน? มันทำอะไร? ฉันสามารถใช้ฝั่งไคลเอ็นต์ได้หรือไม่
ขออภัยมันใช้เป็นตัวอย่างที่นี่: http://dailyjs.com/2010/12/06/node-tutorial-5/
มองหาฟังก์ชั่น loadUser
ฉันเห็นการใช้งานจำนวนมากnext
ใน node.js
มันมาจากไหน? มันทำอะไร? ฉันสามารถใช้ฝั่งไคลเอ็นต์ได้หรือไม่
ขออภัยมันใช้เป็นตัวอย่างที่นี่: http://dailyjs.com/2010/12/06/node-tutorial-5/
มองหาฟังก์ชั่น loadUser
คำตอบ:
สิ่งนี้ดูเหมือนจะเป็นรูปแบบการตั้งชื่อตัวแปรในรหัสการควบคุมโฟลว์ของ Node.js ซึ่งการอ้างอิงไปยังฟังก์ชันถัดไปเพื่อดำเนินการจะได้รับการเรียกกลับเพื่อให้เริ่มต้นเมื่อเสร็จสิ้น
ดูตัวอย่างโค้ดที่นี่:
ลองดูตัวอย่างที่คุณโพสต์:
function loadUser(req, res, next) {
if (req.session.user_id) {
User.findById(req.session.user_id, function(user) {
if (user) {
req.currentUser = user;
return next();
} else {
res.redirect('/sessions/new');
}
});
} else {
res.redirect('/sessions/new');
}
}
app.get('/documents.:format?', loadUser, function(req, res) {
// ...
});
ฟังก์ชั่นคาดว่าฟังก์ชั่นในการโต้เถียงที่สามซึ่งถูกผูกไว้กับชื่อloadUser
next
นี่คือพารามิเตอร์ฟังก์ชันปกติ มันมีการอ้างอิงถึงการกระทำต่อไปเพื่อดำเนินการและเรียกว่าครั้งเดียวloadUser
เสร็จแล้ว (เว้นแต่จะไม่พบผู้ใช้)
ไม่มีอะไรพิเศษเกี่ยวกับชื่อnext
ในตัวอย่างนี้ เราสามารถตั้งชื่อมันได้
.next()
แต่ก็ไม่ได้ ดูเหมือนว่าเขาจะถามเกี่ยวกับnext
วิธีการในวัตถุ
return next();
return callback()
แทนreturn next()
มันเป็นแบบแผนการตั้งชื่อที่ใช้เมื่อผ่านการเรียกกลับในสถานการณ์ที่ต้องดำเนินการตามลำดับของการดำเนินการเช่นสแกนไดเรกทอรี -> อ่านไฟล์ข้อมูล -> ทำอะไรกับข้อมูล นี่คือการตั้งค่าที่จะซ้อนลึกการเรียกกลับ สามส่วนแรกของบทความต่อไปนี้ในบล็อกHowToNodeของ Tim Caswell ให้ภาพรวมที่ดีของสิ่งนี้:
http://howtonode.org/control-flow
ดูที่ส่วนการดำเนินการตามลำดับในส่วนที่สองของการโพสต์นั้น:
มันเหมือนกับการโทรกลับที่express.jsใช้หลังจากที่บางส่วนของโค้ดถูกเรียกใช้และทำคุณสามารถใช้มันเพื่อให้แน่ใจว่าส่วนหนึ่งของรหัสนั้นเสร็จสิ้นและสิ่งที่คุณต้องการทำสิ่งต่อไป แต่จงระวังคุณเท่านั้นที่จะทำได้ ทำหนึ่งres.send
ในแต่ละบล็อกRESTของคุณ...
ดังนั้นคุณสามารถทำสิ่งนี้เป็นnext()
ตัวอย่างง่ายๆ:
app.get("/", (req, res, next) => {
console.log("req:", req, "res:", res);
res.send(["data": "whatever"]);
next();
},(req, res) =>
console.log("it's all done!");
);
นอกจากนี้ยังมีประโยชน์มากเมื่อคุณต้องการมีมิดเดิลแวร์ในแอปของคุณ ...
ในการโหลดฟังก์ชั่นมิดเดิลแวร์ให้เรียกใช้ app.use () เพื่อระบุฟังก์ชั่นมิดเดิลแวร์ ตัวอย่างเช่นรหัสต่อไปนี้โหลดฟังก์ชั่นมิดเดิลแวร์ myLogger ก่อนเส้นทางไปยังเส้นทางราก (/)
var express = require('express');
var app = express();
var myLogger = function (req, res, next) {
console.log('LOGGED');
next();
}
app.use(myLogger);
app.get('/', function (req, res) {
res.send('Hello World!');
})
app.listen(3000);