<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>Xác thực schema trong Node.js bằng Joi</title>
<meta name="description" content="Xác thực schema trong Node.js bằng Joi - Savefile - Tin Tức -...">
<meta name="author" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :.">
<meta name="copyright" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :. [admin@nguoicodonvn2008.info]">
<meta name="robots" content="index, archive, follow, noodp">
<meta name="googlebot" content="index,archive,follow,noodp">
<meta name="msnbot" content="all,index,follow">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="Xác thực schema trong Node.js bằng Joi">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;www.nguoicodonvn2008.info&#x002F;vi&#x002F;news&#x002F;savefile&#x002F;kien-thuc-may-tinh&#x002F;xac-thuc-schema-trong-node-js-bang-joi-7306.html">
<meta property="og:site_name" content=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.">
<meta property="og:url" content="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/xac-thuc-schema-trong-node-js-bang-joi-7306.html">
<link rel="shortcut icon" href="https://www.nguoicodonvn2008.info/favicon.ico">
<link rel="canonical" href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/xac-thuc-schema-trong-node-js-bang-joi-7306.html">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/" title="Tin Tức" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/karaoke-dual/" title="Tin Tức - Karaoke Dual" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nhac-tre/" title="Tin Tức - Nhạc trẻ" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tru-tinh/" title="Tin Tức - Trữ tình" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nuoc-ngoai/" title="Tin Tức - Nước ngoài" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/remix/" title="Tin Tức - Remix" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tam-su-tinh-yeu/" title="Tin Tức - Tâm sự tình yêu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tho-suu-tam/" title="Tin Tức - Thơ sưu tầm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/cuoc-song/" title="Tin Tức - Cuộc sống" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/phan-mem/" title="Tin Tức - Phần mềm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/kien-thuc-may-tinh/" title="Tin Tức - Kiến thức máy tính" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/hoc-tap/" title="Tin Tức - Học tập" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tai-lieu/" title="Tin Tức - Tài liệu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/de-thi/" title="Tin Tức - Đề thi" type="application/rss+xml">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js" type="text/javascript">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css">
<style type="text/css">
	body{background: #fff;}
</style>
    </head>
    <body>
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">.&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.</h2>
		<p class="pull-right"><a title=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;." href="https://www.nguoicodonvn2008.info/">https://www.nguoicodonvn2008.info</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>Xác thực schema trong Node.js bằng Joi</h1>
		<ul class="list-inline">
			<li>Thứ hai - 17/07/2023 00:53</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
		</div>
				<div class="imghome">
			<img alt="Xác thực schema trong Node.js bằng Joi" src="https://st.quantrimang.com/photos/image/2023/07/15/thiet-lap-du-an-test.jpg" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<p style="text-align: justify;"><strong>Bảo mật ứng dụng</strong>&nbsp;bằng cách xác thực dữ liệu ở cấp truy vấn bằng thư viện xác thực Joi rất đơn giản. Dưới đây là&nbsp;<strong>hướng dẫn chi tiết cách xác thực schema trong Node.js bằng Joi</strong>.</p>

<p style="text-align: justify;"><img alt="Node.js" data-i="0" data-src="https://st.quantrimang.com/photos/image/2023/07/15/Node-js-Joi-validation-7.jpg" data-was-processed="true" height="340" src="https://st.quantrimang.com/photos/image/2023/07/15/Node-js-Joi-validation-7.jpg" width="650" /></p>

<p style="text-align: justify;">Chấp nhận dữ liệu chưa được kiểm tra và xác thực vào một ứng dụng web có thể tạo ra lổ hổng bảo mật, và sự cố khó lường dễ phát sinh từ dữ liệu không hợp lệ.</p>

<p style="text-align: justify;">Node.js ORM, chẳng hạn như Sequelize và TypeORM, cho phép bạn đặt các quy tắc xác thực ngay lập tức ở cấp độ ứng dụng. Trong suốt quá trình phát triển API, dữ liệu đi từ các truy vấn HTTP tới những endpoint cụ thể. Điều này xảy ra ở cấp độ truy vấn, vì thế, xác thực mặc định do các ORM cung cấp không dược áp dụng cho chúng.</p>

<p style="text-align: justify;">Joi là một mô tả schema và xác thực dữ liệu cho JavaScript. Tại đây, bạn sẽ học cách dùng thư viện xác thực Joi để xác thực dữ liệu ở cấp độ truy vấn.</p>

<h2 style="text-align: justify;">Thiết lập dự án thử nghiệm</h2>

<p style="text-align: justify;">Để minh họa cách Joi xác thực dữ liệu, bạn sẽ xây dựng một ứng dụng demo đơn giản mô phỏng một app thực tế.</p>

<p style="text-align: justify;"><img alt="Thiết lập dự án thử nghiệm" data-adbro-processed="true" data-i="1" data-src="https://st.quantrimang.com/photos/image/2023/07/15/thiet-lap-du-an-test.jpg" data-was-processed="true" height="322" src="https://st.quantrimang.com/photos/image/2023/07/15/thiet-lap-du-an-test.jpg" width="650" /></p>

<ul style="text-align: justify;">
</ul>

<p style="text-align: justify;">Đầu tiên, tạo một thư mục dự án và truy cập nó bằng cách chạy lệnh sau:</p>

<pre id="pre0">
<code>mkdir demoapp &amp;&amp; cd demoapp</code></pre>

<p style="text-align: justify;">Tiếp theo, khởi tạo npm trong thư mục dự án bằng cách chạy:</p>

<pre id="pre1">
<code>npm init -y</code></pre>

<p style="text-align: justify;">Tiếp theo, bạn cần cài đặt một số phần phụ thuộc. Ở hướng dẫn này, bạn cần:</p>

<ul>
	<li style="text-align: justify;"><strong>Express</strong>: Express là một framework Node.js, cung cấp một nhóm tính năng mạnh mẽ cho web và ứng dụng mobile. Express khiến nó dễ xây dựng các ứng dụng backend hơn với Node.js.</li>
	<li style="text-align: justify;"><strong>Joi</strong>: Joi là một thư viện xác thực dữ liệu cho Node.js.</li>
</ul>

<p style="text-align: justify;">Cài đặt các phần phụ thuộc với trình quản lý gói node bằng cách chạy lệnh sau:</p>

<pre id="pre2">
<code>npm install express joi</code></pre>

<p style="text-align: justify;">Tiếp theo, tạo file&nbsp;<strong>index.js&nbsp;</strong>trong thư mục gốc và thêm khối code sau vào nó:</p>

<pre id="pre3">
<code>const express = require(&quot;express&quot;);
const router = require(&quot;./routes&quot;);
const port = 3000;

const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(router);

app.listen(port, () =&gt; {
  console.log(&quot;app listening on port 3000!&quot;);
});</code></pre>

<p style="text-align: justify;">Khối code trên thiết lập một server Express đơn giản. Nó cấu hình phần mềm trung gian để phân tích dữ liệu truy vấn đến, xử lý truy vấn đến và khởi động server nghe theo các truy vấn đến trên cổng 3000.</p>

<h3 style="text-align: justify;">Định tuyến và xử lý yêu cầu</h3>

<p style="text-align: justify;">Phương thức đơn giản nhất là bạn sẽ tạo một phần mềm trung gian xử lý truy vấn, trả về một mã trạng thái, cùng với nội dung truy vấn, như một phản hồi cho mọi yêu cầu cố gắng gửi dữ liệu đến ứng dụng của bạn.</p>

<p style="text-align: justify;">Tạo file&nbsp;<strong>handler.js&nbsp;</strong>trong thư mục gốc của dự án và thêm khối code bên dưới:</p>

<pre id="pre4">
<code>const demoHandler = (req, res, next) =&gt; {
  res.send({
    code: 201,
    data: req.body,
  });
  next();
};

module.exports = demoHandler;</code></pre>

<p style="text-align: justify;">Tiếp theo, tạo file&nbsp;<strong>router.js&nbsp;</strong>trong thư mục gốc của dự án và thêm khối code bên dưới vào file của bạn:</p>

<pre id="pre5">
<code>const express = require(&quot;express&quot;);
const demoHandler = require(&quot;./handler&quot;);
const router = express.Router();

router.post(&quot;/signup&quot;, demoHandler);

module.exports = router;</code></pre>

<h2 style="text-align: justify;">Tạo Joi Schema</h2>

<p style="text-align: justify;">Một Joi schema đại diện cho một cấu trúc được mong đợi của một đối tượng dữ liệu cụ thể và các quy tắc xác thực.</p>

<div style="text-align: justify;">&nbsp;</div>

<p style="text-align: justify;">Để tạo một Joi schema, bạn có thể dùng phương thức Joi.object() và xâu chuỗi các quy tắc xác thực khác nhau do Joi đưa ra để xác định cấu trúc &amp; các yêu cầu xác thực cho dữ liệu của bạn.</p>

<p style="text-align: justify;">Ví dụ:</p>

<pre id="pre6">
<code>const exampleSchema = Joi.object({
  name: Joi.string().min(3).required(),
});</code></pre>

<p style="text-align: justify;">Ví dụ trên mô tả một Joi schema đơn giản với thuộc tính&nbsp;<strong>name</strong>. Thuộc tính name có giá trị của&nbsp;<strong>Joi.string().min(3).required()</strong>. Điều này có nghĩa là giá trị name sẽ là một chuỗi, với độ dài tối thiểu bắt buộc phải có là 3 ký tự.</p>

<p style="text-align: justify;">Dùng Joi, bạn có thể xâu chuỗi các phương thức khác nhau để thêm nhiều giới hạn xác thực hơn cho từng trường được xác định trong schema.</p>

<p style="text-align: justify;">Ví dụ:</p>

<pre id="pre7">
<code>const userSchema = Joi.object({
  email: Joi.string().email().required(),

  password: Joi.string().min(6).required(),

  age: Joi.number().min(18).optional(),

  employed: Joi.boolean().optional(),

  phone: Joi.string()
    .regex(/^\\d{3}-\\d{3}-\\d{4}$/)//&quot;123-456-7890&quot;
    .required(),

  address: Joi.object({
    street: Joi.string().min(3).required(),
    city: Joi.string().min(3).required(),
    state: Joi.string().min(3).required(),
    zip: Joi.number().min(3).required(),
  }).required(),

 hobbies: Joi.array().items(Joi.string()).required(),

}).options({ abortEarly: false });</code></pre>

<p style="text-align: justify;"><strong>userSchema</strong>&nbsp;xác định các yêu cầu ràng buộc sau cho từng thuộc tính:</p>

<ul>
	<li style="text-align: justify;"><strong>Email</strong>: Phải là một chuỗi email hợp lệ.</li>
	<li style="text-align: justify;"><strong>Password</strong>: Phải là một chuỗi với một số gồm 6 ký tự.</li>
	<li style="text-align: justify;"><strong>Age</strong>: Một số tùy chọn với giá trị tối thiểu là 18.</li>
	<li style="text-align: justify;"><strong>Employed</strong>: Một boolean tùy chọn.</li>
	<li style="text-align: justify;"><strong>Phone</strong>: Một chuỗi được yêu cầu phù hợp với biểu thức chính quy cụ thể<strong>&nbsp;(/^\d{3}-\d{3}-\d{4}$/)</strong>.</li>
	<li style="text-align: justify;"><strong>Address</strong>: Một đối tượng đại diện cho địa chỉ của người dùng với những thuộc tính phụ sau:
	<ul>
		<li><strong>Street</strong>: Một chuỗi bắt buộc có độ dài tối thiểu 3 ký tự.</li>
		<li><strong>City</strong>: Một chuỗi bắt buộc có độ dài tối thiểu 3 ký tự.</li>
		<li><strong>State</strong>: Một chuỗi bắt buộc có độ dài tối thiểu 3 ký tự.</li>
		<li><strong>Zip</strong>: Một chuỗi bắt buộc có giá trị tối thiểu bằng 3.</li>
	</ul>
	</li>
	<li style="text-align: justify;"><strong>Hobbies</strong>: Mảng bắt buộc của các chuỗi.</li>
</ul>

<p style="text-align: justify;">Ngoài các giới hạn,&nbsp;<strong>userSchema&nbsp;</strong>đặt tùy chọn<strong>&nbsp;abortEarly</strong>&nbsp;sang&nbsp;<strong>false</strong>. Mặc định, Joi dừng chạy chương trình ngay khi nó gặp lỗi đầu tiên và in lỗi cho console. Tuy nhiên, đặt tùy chọn này sang&nbsp;<strong>false&nbsp;</strong>đảm bảo Joi kiểm tra toàn bộ schema và in tất cả lỗi gặp phải cho console.</p>

<h2 style="text-align: justify;">Xác thực dữ liệu với Joi</h2>

<p style="text-align: justify;">Tạo file&nbsp;<strong>validation.js&nbsp;</strong>và thêm code&nbsp;<strong>userSchema&nbsp;</strong>cho nó.</p>

<p style="text-align: justify;">Ví dụ:</p>

<pre id="pre8">
<code>//validation.js
const Joi = require(&quot;joi&quot;);

const userSchema = Joi.object({
//...
}).options({ abortEarly: false });

module.exports = userSchema;</code></pre>

<p style="text-align: justify;">Sau đó, tạo middleware chặn payload truy vấn và xác minh chúng dựa trên schema được cung cấp bằng cách thêm code sau vào bên dưới code&nbsp;<strong>userSchema</strong>.</p>
&nbsp;

<pre id="pre9">
<code>const validationMiddleware = (schema) =&gt; {
  return (req, res, next) =&gt; {
    const { error } = schema.validate(req.body);

    if (error) {
      // Xử lý lỗi xác thực
      console.log(error.message);

      res.status(400).json({ errors: error.details });
    } else {
      // Dữ liệu hợp lệ, tiếp tục xử lý middleware tiếp theo
      next();
    }
  };
};</code></pre>

<p style="text-align: justify;">Khi một yêu cầu được thực hiện, middleware sẽ gọi phương thức&nbsp;<strong>validate</strong>&nbsp;của schema để xác thực nội dung truy vấn. Nếu có bất kỳ lỗi xác thực xảy ra,&nbsp;<strong>middleware</strong>&nbsp;gửi phản hồi&nbsp;<strong>400 Bad Request&nbsp;</strong>kèm thông báo lỗi được truy xuất từ chi tiết lỗi xác thực.</p>

<p style="text-align: justify;">Mặt khác, nếu xác thực thành công mà không có lỗi, middeware gọi hàm&nbsp;<strong>next()</strong>.</p>

<p style="text-align: justify;">Cuối cùng, xuất&nbsp;<strong>validationMiddleware</strong>&nbsp;và&nbsp;<strong>userSchema</strong>.</p>

<pre id="pre10">
<code>module.exports = {
  userSchema,
  validationMiddleware,
};</code></pre>

<h2 style="text-align: justify;">Kiểm tra các điều kiện xác thực</h2>

<p style="text-align: justify;">Nhập<strong>&nbsp;validationMiddleware</strong>&nbsp;và<strong>&nbsp;userSchema</strong>&nbsp;vào file<strong>&nbsp;router.js</strong>, đồng thời thiết lập middleware như sau:</p>

<pre id="pre11">
<code>const { validationMiddleware, userSchema } = require(&quot;./validation&quot;);
router.post(&quot;/signup&quot;, validationMiddleware(userSchema), demoHandler);</code></pre>

<p style="text-align: justify;">Khởi động ứng dụng bằng cách chạy lệnh bên dưới:</p>

<pre id="pre12">
<code>node index.js</code></pre>

<p style="text-align: justify;">Sau đó, tạo truy vấn HTTP POST tới<strong>&nbsp;localhost:3000/signup</strong>&nbsp;bằng dữ liệu kiểm tra bên dưới. Bạn có thể đạt được điều này bằng cách dùng cURL hoặc bất kỳ client API khác.</p>

<pre id="pre13">
<code>{
  &quot;email&quot;: &quot;user@example&quot;, // Invalid email format
  &quot;password&quot;: &quot;pass&quot;, // Password length less than 6 characters
  &quot;age&quot;: 15, // Age below 18
  &quot;employed&quot;: true,
  &quot;hobbies&quot;: &#91;&quot;reading&quot;, &quot;running&quot;&#93;,
  &quot;phone&quot;: &quot;123-456-789&quot;, // Invalid phone number format
  &quot;address&quot;: {
    &quot;street&quot;: &quot;123&quot;,
    &quot;city&quot;: &quot;Example City&quot;,
    &quot;state&quot;: &quot;Example State&quot;,
    &quot;zip&quot;: 12345
  }
}</code></pre>

<p style="text-align: justify;">Truy vấn này sẽ thất bại và trả về một đối tượng lỗi khi payload chứa rất nhiều trường không hợp lệ, chẳng hạn như email, mật khẩu, độ tuổi và số điện thoại. Dùng đối tượng lỗi được cung cấp, bạn có thể xử lý lỗi phù hợp.</p>

<h3 style="text-align: justify;">Đơn giản hóa xác thực dữ liệu bằng Joi</h3>

<p style="text-align: justify;">Trên đây là những điều bạn cần biết về xác thực dữ liệu bằng Joi. Như bạn thấy cũng khá đơn giản phải không? Chúc các bạn thành công!</p>
		</div>
				<div id="author">
						<p>
				<strong>Nguồn tin:</strong>
				Quantrimang.com
			</p>
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/xac-thuc-schema-trong-node-js-bang-joi-7306.html" title="Xác thực schema trong Node.js bằng Joi">https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/xac-thuc-schema-trong-node-js-bang-joi-7306.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; .&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.
		</div>
		<div id="contact">
			<a href="mailto:admin@nguoicodonvn2008.info">admin@nguoicodonvn2008.info</a>
		</div>
	</div>
</div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://www.nguoicodonvn2008.info/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
		</script>
		<div class="car-top">
  <span><img src="https://www.nguoicodonvn2008.info/themes/default/images/car.png" alt=""></span>
</div>
<script src="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="nv4c_e856T",nv_check_pass_mstime=1738000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://www.nguoicodonvn2008.info/assets/js/language/vi.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/global.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/site.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/news.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/main.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/custom.js"></script>
<script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "url": "https://www.nguoicodonvn2008.info",
            "logo": "https://www.nguoicodonvn2008.info/uploads/angel.gif"
        }
        </script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js"></script>
<script type="text/javascript">
var $scrolltop = $('.car-top');
$scrolltop.on('click', function () {
    $('html,body').animate({
        scrollTop: 0
    }, 800);
    $(this).addClass("car-run");
    setTimeout(function(){ $scrolltop.removeClass('car-run');}, 1000);
    return false;
});
$(window).on('scroll', function ()
{ 
    if($(window).scrollTop() >= 200)
    {
        $scrolltop.addClass("show");
        $scrolltop.addClass("car-down");
    }
    else
    {
       $scrolltop.removeClass("show");
       setTimeout(function(){ $scrolltop.removeClass('car-down');}, 300);
    }
});
</script>
</body>
</html>