<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Talan</title>
    <description>The latest articles on DEV Community by Talan (@tuantnguyen).</description>
    <link>https://dev.to/tuantnguyen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F66672%2F35fb2712-8dde-460d-9d85-d33c254d8e7e.png</url>
      <title>DEV Community: Talan</title>
      <link>https://dev.to/tuantnguyen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tuantnguyen"/>
    <language>en</language>
    <item>
      <title>Xử lý error trong rest api nodejs</title>
      <dc:creator>Talan</dc:creator>
      <pubDate>Sun, 20 Oct 2019 00:39:11 +0000</pubDate>
      <link>https://dev.to/tuantnguyen/x-ly-error-trong-rest-api-nodejs-f15</link>
      <guid>https://dev.to/tuantnguyen/x-ly-error-trong-rest-api-nodejs-f15</guid>
      <description>&lt;p&gt;Tạo ra 1 middleware error cho việc xử lý lỗi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Xử lý middleware cho error
&lt;/h2&gt;

&lt;p&gt;Tại nơi định nghĩa app cho express xử lý như sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Import error từ middlewares đã được định nghĩa
&lt;code&gt;const error = require('../api/middlewares/error')&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Bind app middleware tới instance của express:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// if error is not an instanceOf APIError, convert it.
// APIError là class có chứa cấu trúc lỗi
app.use(error.converter);

// catch 404 and forward to error handler
app.use(error.notFound);

// error handler, send stacktrace only during development
app.use(error.handler);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Định nghĩa APIError class
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tạo file APIError.js chẳng hạn tại &lt;code&gt;src/api/utils/APIError.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nội dung file như sau
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* eslint-disable max-classes-per-file */
const httpStatus = require('http-status');

/**
 * @extends Error
 */
class ExtendableError extends Error {
  constructor({
 message, errors, status, isPublic, stack 
}) {
    super(message);
    this.name = this.constructor.name;
    this.message = message;
    this.errors = errors;
    this.status = status;
    this.isPublic = isPublic;
    this.isOperational = true; // This is required since bluebird 4 doesn't append it anymore.
    this.stack = stack;
    // Error.captureStackTrace(this, this.constructor.name);
  }
}

/**
 * Class representing an API error.
 * @extends ExtendableError
 */
class APIError extends ExtendableError {
  /**
   * Creates an API error.
   * @param {string} message - Error message.
   * @param {number} status - HTTP status code of error.
   * @param {boolean} isPublic - Whether the message should be visible to user or not.
   */
  constructor({
    message,
    errors,
    stack,
    status = httpStatus.INTERNAL_SERVER_ERROR,
    isPublic = false,
  }) {
    super({
      message,
      errors,
      status,
      isPublic,
      stack,
    });
  }
}

module.exports = APIError;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Xử lý error trong middleware
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tạo file &lt;code&gt;error.js&lt;/code&gt;, chẳng hạn như &lt;code&gt;src/api/middlewares/error.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nội dung xử lý như sau:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const httpStatus = require('http-status');
const expressValidation = require('express-validation');
const APIError = require('../utils/APIError');

/**
 * Error handler. Send stacktrace only during development
 * @public
 */
const handler = (err, req, res, next) =&amp;gt; {
  const response = {
    code: err.status,
    message: err.message || httpStatus[err.status],
    errors: err.errors,
    stack: err.stack,
  };

  if (process.env !== 'development') {
    delete response.stack;
  }

  res.status(err.status);
  res.json(response);
};
exports.handler = handler;

/**
 * If error is not an instanceOf APIError, convert it.
 * @public
 */
exports.converter = (err, req, res, next) =&amp;gt; {
  let convertedError = err;

  if (err instanceof expressValidation.ValidationError) {
    convertedError = new APIError({
      message: 'Validation Error',
      errors: err.errors,
      status: err.status,
      stack: err.stack,
    });
  } else if (!(err instanceof APIError)) {
    convertedError = new APIError({
      message: err.message,
      status: err.status,
      stack: err.stack,
    });
  }

  return handler(convertedError, req, res);
};

/**
 * Catch 404 and forward to error handler
 * @public
 */
exports.notFound = (req, res, next) =&amp;gt; {
  const err = new APIError({
    message: 'Not found',
    status: httpStatus.NOT_FOUND,
  });
  return handler(err, req, res);
};

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>restapi</category>
      <category>node</category>
      <category>errors</category>
    </item>
    <item>
      <title>Xử lý error trong rest api nodejs</title>
      <dc:creator>Talan</dc:creator>
      <pubDate>Sat, 19 Oct 2019 23:40:05 +0000</pubDate>
      <link>https://dev.to/tuantnguyen/x-ly-error-trong-rest-api-nodejs-1702</link>
      <guid>https://dev.to/tuantnguyen/x-ly-error-trong-rest-api-nodejs-1702</guid>
      <description>&lt;p&gt;Tạo ra 1 middleware error cho việc xử lý lỗi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Xử lý middleware cho error
&lt;/h2&gt;

&lt;p&gt;Tại nơi định nghĩa app cho express xử lý như sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Import error từ middlewares đã được định nghĩa
&lt;code&gt;const error = require('../api/middlewares/error')&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Bind app middleware tới instance của express:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// if error is not an instanceOf APIError, convert it.
// APIError là class có chứa cấu trúc lỗi
app.use(error.converter);

// catch 404 and forward to error handler
app.use(error.notFound);

// error handler, send stacktrace only during development
app.use(error.handler);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Định nghĩa APIError class
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tạo file APIError.js chẳng hạn tại &lt;code&gt;src/api/utils/APIError.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nội dung file như sau
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* eslint-disable max-classes-per-file */
const httpStatus = require('http-status');

/**
 * @extends Error
 */
class ExtendableError extends Error {
  constructor({
 message, errors, status, isPublic, stack 
}) {
    super(message);
    this.name = this.constructor.name;
    this.message = message;
    this.errors = errors;
    this.status = status;
    this.isPublic = isPublic;
    this.isOperational = true; // This is required since bluebird 4 doesn't append it anymore.
    this.stack = stack;
    // Error.captureStackTrace(this, this.constructor.name);
  }
}

/**
 * Class representing an API error.
 * @extends ExtendableError
 */
class APIError extends ExtendableError {
  /**
   * Creates an API error.
   * @param {string} message - Error message.
   * @param {number} status - HTTP status code of error.
   * @param {boolean} isPublic - Whether the message should be visible to user or not.
   */
  constructor({
    message,
    errors,
    stack,
    status = httpStatus.INTERNAL_SERVER_ERROR,
    isPublic = false,
  }) {
    super({
      message,
      errors,
      status,
      isPublic,
      stack,
    });
  }
}

module.exports = APIError;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Xử lý error trong middleware
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tạo file &lt;code&gt;error.js&lt;/code&gt;, chẳng hạn như &lt;code&gt;src/api/middlewares/error.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nội dung xử lý như sau:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const httpStatus = require('http-status');
const expressValidation = require('express-validation');
const APIError = require('../utils/APIError');

/**
 * Error handler. Send stacktrace only during development
 * @public
 */
const handler = (err, req, res, next) =&amp;gt; {
  const response = {
    code: err.status,
    message: err.message || httpStatus[err.status],
    errors: err.errors,
    stack: err.stack,
  };

  if (process.env !== 'development') {
    delete response.stack;
  }

  res.status(err.status);
  res.json(response);
};
exports.handler = handler;

/**
 * If error is not an instanceOf APIError, convert it.
 * @public
 */
exports.converter = (err, req, res, next) =&amp;gt; {
  let convertedError = err;

  if (err instanceof expressValidation.ValidationError) {
    convertedError = new APIError({
      message: 'Validation Error',
      errors: err.errors,
      status: err.status,
      stack: err.stack,
    });
  } else if (!(err instanceof APIError)) {
    convertedError = new APIError({
      message: err.message,
      status: err.status,
      stack: err.stack,
    });
  }

  return handler(convertedError, req, res);
};

/**
 * Catch 404 and forward to error handler
 * @public
 */
exports.notFound = (req, res, next) =&amp;gt; {
  const err = new APIError({
    message: 'Not found',
    status: httpStatus.NOT_FOUND,
  });
  return handler(err, req, res);
};

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>restapi</category>
      <category>node</category>
      <category>errors</category>
    </item>
    <item>
      <title>Middleware trong expressjs là gì? Tác dụng và cách sử dụng như thế nào?</title>
      <dc:creator>Talan</dc:creator>
      <pubDate>Fri, 24 Aug 2018 01:44:52 +0000</pubDate>
      <link>https://dev.to/tuantnguyen/middleware-trong-expressjs-l-g-tc-dng-v-cch-s-dng-nh-th-no-3i2j</link>
      <guid>https://dev.to/tuantnguyen/middleware-trong-expressjs-l-g-tc-dng-v-cch-s-dng-nh-th-no-3i2j</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Middleware trong ngành phần mềm nói chung là gì?&lt;/li&gt;
&lt;li&gt;Middleware trong các ứng dụng website như thế nào?&lt;/li&gt;
&lt;li&gt;Middleware trong expressjs&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Problem
&lt;/h1&gt;

&lt;p&gt;Khi mình tìm hiểu về express cụ thể là hàm cơ bản &lt;code&gt;app.use()&lt;/code&gt; thì thấy có nhắc đến định nghĩa &lt;code&gt;middleware function&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mounts the specified middleware function or functions at the specified path: the middleware function is executed when the base of the requested path matches path.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suy ngẫm một lúc cũng chưa rõ và chưa nắm được bản chất nên đành tìm hiểu về thuật ngữ &lt;code&gt;middleware&lt;/code&gt; vậy. Tuy mất công thật, tìm hiểu và viết thành blog nhưng lại cảm thấy sướng vl.&lt;/p&gt;

&lt;h2 id="middleware-software"&gt;Middleware trong ngành phần mềm nói chung là gì?&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Middleware là phần mềm máy tính với nhiệm vụ kết nối các thành phần phần mềm hoặc các ứng dụng với nhau. Phần mềm loại này bao gồm một tập các dịch vụ cho phép sự tương tác giữa các tiến trình chạy trên một hoặc nhiều máy khác nhau. Công nghệ middleware đã được phát triển để cung cấp khả năng hoạt động tương hỗ, phục vụ cho các kiến trúc phân tán thường được để hỗ trợ và đơn giản hóa các ứng dụng phân tán phức tạp.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ls2s6twhoabywr3zdht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ls2s6twhoabywr3zdht.png" alt="middleware software" width="751" height="631"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Middleware là software nằm giữa hệ điều hành và các ứng dụng chạy trên OS đó. Nhằm mục đích quản lý data và sự giao tiếp của các distributed apps&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Distributed apps là các ứng dụng hay phần mềm mà chạy trên multiple computers nhưng trong cùng 1 hệ thống network. Không giống như các apps truyền thống chỉ chạy trên 1 hệ thống đơn (single system), thì các distributed apps chạy trên multi systems 1 cách đồng thời 1 task hoặc 1 job nào đó. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Có thể tưởng tượng middleware giống như các ống nước vậy. Các ống nước này sẽ là nơi kết nối giữa các cáp lại với nhau, nhận đầu vào từ nơi này và chuyển nước đến đầu ra mong muốn.&lt;br&gt;
Nói một cách development thì nó sẽ connect 2 ứng dụng lại với nhau vì thế data hoặc database có thể trao đổi dễ dàng qua các ống nước này.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1523552322653-4ca2658acbb0%3Fixlib%3Drb-0.3.5%26ixid%3DeyJhcHBfaWQiOjEyMDd9%26s%3D416bc1a26c48e9928a428a2e1f95d86c%26auto%3Dformat%26fit%3Dcrop%26w%3D1351%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1523552322653-4ca2658acbb0%3Fixlib%3Drb-0.3.5%26ixid%3DeyJhcHBfaWQiOjEyMDd9%26s%3D416bc1a26c48e9928a428a2e1f95d86c%26auto%3Dformat%26fit%3Dcrop%26w%3D1351%26q%3D80" alt="pipe" width="1351" height="901"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="middleware-web"&gt;Middleware trong các ứng dụng website như thế nào?&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Nó là cầu nối giữa database và application&lt;/li&gt;
&lt;li&gt;Xử lý request và quyết định các response trả về thế nào&lt;/li&gt;
&lt;li&gt;Cũng có thể là cầu nối giữa các components&lt;/li&gt;
&lt;li&gt;Cũng có thể control application sẽ như thế nào nếu có lỗi &lt;/li&gt;
&lt;li&gt;Là software component được nhúng vào ứng dụng để xử lý request và response của các user actions &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="middleware-express"&gt;Middleware trong expressjs&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Express is a routing and &lt;strong&gt;middleware web framework&lt;/strong&gt; that has minimal functionality of its own: An Express application is essentially a series of middleware function calls&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vì bản chất nó thế nên khi làm việc với express chúng ta thường xuyên sử dụng một loạt của middleware functions.&lt;/p&gt;

&lt;p&gt;Middleware trong expressjs là:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Một loạt các functions được gọi bởi router layer trước khi request cuối cùng được thực thi &lt;/li&gt;
&lt;li&gt;Function nhận các request, response của 1 chu kỳ HTTP request/response &lt;/li&gt;
&lt;li&gt;Function có thể chình sửa request, response trước khi gửi chúng đến &lt;code&gt;next&lt;/code&gt; middleware function &lt;/li&gt;
&lt;li&gt;Có thể update response hoặc chấm dứt nếu cần thiết&lt;/li&gt;
&lt;li&gt;Function nhận vào ba tham số: đối tượng &lt;a href="https://expressjs.com/en/4x/api.html#req" rel="noopener noreferrer"&gt;request&lt;/a&gt;, đối tượng &lt;a href="https://expressjs.com/en/4x/api.html#res" rel="noopener noreferrer"&gt;response&lt;/a&gt; và &lt;code&gt;next&lt;/code&gt; function
Ví dụ:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fogvin22czpn9jrkokb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fogvin22czpn9jrkokb.png" alt="middle component" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tác dụng
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Middleware function được dùng để làm các việc sau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thực thi bất kỳ đoạn code nào &lt;/li&gt;
&lt;li&gt;Update request, response &lt;/li&gt;
&lt;li&gt;Làm kết thúc chu kỳ request-response. Ví dụ có 1 vài exception xảy ra thì thay vì gọi hàm &lt;code&gt;next&lt;/code&gt; thì mình có thể kết thúc nó luôn&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Express application có thể sử dụng các loại middleware sau&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://expressjs.com/en/guide/using-middleware.html#middleware.application" rel="noopener noreferrer"&gt;Application-level middleware&lt;/a&gt;
Bind application-level middleware thành instance của &lt;a href="https://expressjs.com/en/4x/api.html#app" rel="noopener noreferrer"&gt;app object&lt;/a&gt; thành việc có thể sử dụng bằng &lt;code&gt;app.use()&lt;/code&gt; và &lt;code&gt;app.METHOD()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://expressjs.com/en/guide/using-middleware.html#middleware.router" rel="noopener noreferrer"&gt;Router-level middleware&lt;/a&gt;
Cách thức hoạt động giống như &lt;code&gt;application-level-middleware&lt;/code&gt;, ngoại trừ nó bị ràng buộc bởi instance &lt;code&gt;express.Router()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://expressjs.com/en/guide/using-middleware.html#middleware.error-handling" rel="noopener noreferrer"&gt;Error-handling middleware&lt;/a&gt;
Tên gọi nói lên tất cả&lt;/li&gt;
&lt;li&gt;&lt;a href="https://expressjs.com/en/guide/using-middleware.html#middleware.built-in" rel="noopener noreferrer"&gt;Built-in middleware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://expressjs.com/en/guide/using-middleware.html#middleware.third-party" rel="noopener noreferrer"&gt;Third-party middleware&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cookieParser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cookie-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// lib bên thứ ba&lt;/span&gt;

&lt;span class="c1"&gt;// load the cookie-parsing middleware&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cookieParser&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ví dụ về cách sử dụng đơn giản
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bài toán: tạo ra middleware dùng để in current time và lưu 1 cuốn sách vào database và render message&lt;/li&gt;
&lt;li&gt;Bài giải:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1/ Tạo method cho logging current time&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;//create a method to&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;requestTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;requestTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Current Time for Request&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;requestTime&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2/ Sử dụng middleware function trên như là application-level middleware&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//use the middleware as an application-level middleware&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requestTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3/ Tạo middleware để kết nối vào DB&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// method to conenct to be&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;conencttodb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb://localhost:27017/library&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;connect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;conencted to db!!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;//mongoose.set('debug', true);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;conencttodb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4/ Lưu thông tin cuốn sách bằng việc sử dụng &lt;code&gt;next&lt;/code&gt; function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// create a new book&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Peter Quill&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;starlord55&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;yearpubished&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2011&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;ratings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// save the book in database&lt;/span&gt;
&lt;span class="nx"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;something went wrong&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// res.contentType('application/json');&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;the book has bees saved at&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;requestTime&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  WHAT TO DO NEXT
&lt;/h2&gt;

&lt;p&gt;Tiếp tục vọc node js =))&lt;/p&gt;

</description>
      <category>middleware</category>
      <category>express</category>
      <category>node</category>
    </item>
  </channel>
</rss>
