javascript node.js next ()


148

Tôi thấy rất nhiều sử dụng nexttrong node.js.

Nó là gì, nó đến từ đâu? Nó làm gì? Tôi có thể sử dụng nó phía khách hàng không?

Xin lỗi, nó được sử dụng ví dụ ở đây: http://dailyjs.com/2010/12/06/node-tutorial-5/

tìm kiếm hàm loadUser.


Tôi đã không thấy điều này ở bất cứ đâu và nó không được tham chiếu ở bất cứ đâu trong tài liệu. Bạn có chắc chắn nó không được xác định ở đâu đó trong cơ sở mã bạn đang xem không?
Samir Talwar

Điều đó quá mơ hồ. Bạn có thể cho một ví dụ về bối cảnh.
Raynos

Câu trả lời:


114

Đây dường như là một quy ước đặt tên biến trong mã luồng điều khiển Node.js, trong đó một tham chiếu đến hàm tiếp theo để thực thi được đưa ra cho một cuộc gọi lại để nó khởi động khi nó hoàn thành.

Xem, ví dụ, các mẫu mã ở đây:

Hãy xem ví dụ bạn đã đăng:

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) {
  // ...
});

Các loadUserchức năng hy vọng một hàm trong lập luận thứ ba, đó là ràng buộc để tên next. Đây là một tham số chức năng bình thường. Nó giữ một tham chiếu đến hành động tiếp theo để thực hiện và được gọi một lần loadUserđược thực hiện (trừ khi không thể tìm thấy người dùng).

Không có gì đặc biệt về tên nexttrong ví dụ này; chúng tôi có thể đặt tên cho nó bất cứ điều gì.


Điều này cũng được sử dụng khá nhiều trong express.js nhưng thực tế không phải vậy .next(). Anh ta dường như hỏi về nextmột phương pháp trên một đối tượng.
Raynos

1
Sử dụng tốt hơnreturn next();
Ryan Walton

2
@RyanWalton Tôi đồng ý
Wayne

Tôi đã sử dụng return callback()thay vìreturn next()
vijay

39

Đó là quy ước đặt tên được sử dụng khi chuyển các cuộc gọi lại trong các tình huống yêu cầu thực hiện các hành động nối tiếp, ví dụ thư mục quét -> đọc dữ liệu tệp -> làm gì đó với dữ liệu. Đây là ưu tiên để lồng sâu các cuộc gọi lại. Ba phần đầu tiên của bài viết sau đây trên blog HowToNode của Tim Caswell cung cấp một cái nhìn tổng quan tốt về điều này:

http://howtonode.org/control-flow

Đồng thời xem phần Hành động tuần tự của phần thứ hai của bài đăng đó:

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


1
Cảm ơn rất nhiều cho liên kết này. Nó giải thích rất nhiều điều khi bắt đầu làm việc với nodejs
Hassam Abdelillah

Liên kết hiện không hoạt động. Nó đang báo lỗi Máy chủ nội bộ
Deep Kakkar

1
Các liên kết được cập nhật từ kho lưu trữ internet
Pero P.

cảm ơn bạn về các liên kết, tôi đã bắt đầu sử dụng Node vài tháng trước nhưng tôi thấy mình sử dụng các thực hành này nhưng không hiểu đầy đủ về chúng
Charles Smith

8

Về cơ bản, nó giống như một cuộc gọi lại mà express.js sử dụng sau khi một phần nhất định của mã được thực thi và thực hiện, bạn có thể sử dụng nó để đảm bảo rằng một phần của mã đã được thực hiện và những gì bạn muốn làm tiếp theo, nhưng hãy luôn chú ý bạn chỉ có thể làm một res.sendtrong mỗi khối REST của bạn ...

Vì vậy, bạn có thể làm một cái gì đó như thế này như một next()ví dụ đơn giản :

app.get("/", (req, res, next) => {
  console.log("req:", req, "res:", res);
  res.send(["data": "whatever"]);
  next();
},(req, res) =>
  console.log("it's all done!");
);

Nó cũng rất hữu ích khi bạn muốn có một phần mềm trung gian trong ứng dụng của mình ...

Để tải chức năng phần mềm trung gian, hãy gọi app.use (), chỉ định chức năng phần mềm trung gian. Ví dụ: đoạn mã sau tải chức năng phần mềm trung gian myLogger trước khi định tuyến đến đường dẫn gốc (/).

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.