javascript node.js ถัดไป ()


148

ฉันเห็นการใช้งานจำนวนมากnextใน node.js

มันมาจากไหน? มันทำอะไร? ฉันสามารถใช้ฝั่งไคลเอ็นต์ได้หรือไม่

ขออภัยมันใช้เป็นตัวอย่างที่นี่: http://dailyjs.com/2010/12/06/node-tutorial-5/

มองหาฟังก์ชั่น loadUser


ฉันไม่ได้เห็นสิ่งนี้ทุกที่และไม่มีการอ้างอิงใด ๆ ในเอกสารประกอบ คุณแน่ใจหรือว่าไม่ได้ระบุที่ใดที่หนึ่งในฐานรหัสที่คุณกำลังดูอยู่
Samir Talwar

มันคลุมเครือเกินไป คุณสามารถยกตัวอย่างบริบท
Raynos

คำตอบ:


114

สิ่งนี้ดูเหมือนจะเป็นรูปแบบการตั้งชื่อตัวแปรในรหัสการควบคุมโฟลว์ของ 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ในตัวอย่างนี้ เราสามารถตั้งชื่อมันได้


นี้จะใช้ค่อนข้างมากใน express.js .next()แต่ก็ไม่ได้ ดูเหมือนว่าเขาจะถามเกี่ยวกับnextวิธีการในวัตถุ
Raynos

1
ดีกว่าที่จะใช้return next();
Ryan Walton

2
@RyanWalton ฉันเห็นด้วย
Wayne

ผมใช้return callback()แทนreturn next()
วีเจย์

39

มันเป็นแบบแผนการตั้งชื่อที่ใช้เมื่อผ่านการเรียกกลับในสถานการณ์ที่ต้องดำเนินการตามลำดับของการดำเนินการเช่นสแกนไดเรกทอรี -> อ่านไฟล์ข้อมูล -> ทำอะไรกับข้อมูล นี่คือการตั้งค่าที่จะซ้อนลึกการเรียกกลับ สามส่วนแรกของบทความต่อไปนี้ในบล็อกHowToNodeของ Tim Caswell ให้ภาพรวมที่ดีของสิ่งนี้:

http://howtonode.org/control-flow

ดูที่ส่วนการดำเนินการตามลำดับในส่วนที่สองของการโพสต์นั้น:

http://howtonode.org/control-flow-part-ii


1
ขอบคุณมากสำหรับลิงค์นี้ มันอธิบายหลายสิ่งหลายอย่างเมื่อเริ่มทำงานกับ nodejs
Hassam Abdelillah

ลิงก์ไม่ทำงานในขณะนี้ มันเป็นข้อผิดพลาดเซิร์ฟเวอร์ภายใน
Deep Kakkar

1
ลิงก์ล่าสุดจากคลังข้อมูลอินเทอร์เน็ต
Pero P.

ขอบคุณสำหรับลิงก์ฉันเริ่มใช้ Node เมื่อไม่กี่เดือนที่ผ่านมา แต่ฉันพบว่าตัวเองกำลังใช้วิธีการเหล่านี้ แต่ไม่เข้าใจพวกเขาอย่างสมบูรณ์
Charles Smith

8

มันเหมือนกับการโทรกลับที่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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.