Bạn dùng socket-io tester ấy. Chứ chưa chắc transport của bạn là ws.

Best posts made by Nguyen Hien
-
RE: Hỏi về test socket io bằng Postman
-
RE: Mình là người mới!!!
- Hiểu hệ thống server - client và cách hoạt động:
- Restful : https://viblo.asia/phung.the.tai/posts/OEqGj5JNM9bL
- WebSocket: https://en.wikipedia.org/wiki/WebSocket
- Tìm hiểu JavaScript:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript (tập trung phần biến, cấu trúc, cách xử lí string, number, date, object)
- Tìm hiểu qua MongoDB hoặc MySQL + sử dụng ORM để dễ dang hơn :
MongoDB: https://tedu.com.vn/mongo-db/mongodb-la-gi-tai-sao-lai-dung-mongodb-26.html
MySQL: https://www.mysql.com/
Mongose (ORM của mongoDB) : http://mongoosejs.com/
SequelizeJS (ORM của MySQL, SQLite, ...: http://docs.sequelizejs.com/en/v3/ - Rồi oke. Lao vào NodeJS đi:
- Tập sài framework : AngularJS, React, Express, Loopback, Meteor.
Goodluck :)))
-
RE: Thảo luận về vấn đề viết ứng dụng chat realtime
Nếu hiểu về NodeJS thì bạn dùng Socket.IO :
https://socket.io/ (trong đây code example chat application. Bàn làm kiểu một directive hay một component với nó)Nếu lười phát triển toàn diện từ web server abcxyz thì thằng này:
https://www.meteor.com/
Dùng meteor để viết chat app: https://www.codementor.io/codeforgeek/getting-started-with-meteor-build-sample-app-du107r3o2:))). Còn lại bạn tự tìm hiểu để map vào cái app mà bạn đang viết cho đúng thôi.
-
RE: [Mongodb] Hỏi về việc disconnect mongodb
@Nos-Gnoh
Ý tưởng ở đây mình sẽ dùng 1 pool để chưa connection tới MongoDB. Nó sẽ làm nhiệm vụ quản lý dùm mình. Mình chỉ cần thực hiện các lệnh như insert, find, update...
Mình asume là bạn dùng: https://github.com/mongodb/node-mongodb-native
Ý tưởng của mình thì lấy từ bài viết này: https://www.compose.com/articles/connection-pooling-with-mongodb/Code chính
// This is a global variable we'll use for handing the MongoDB client var mongodb; // Connection URL var url = '[connectionString]'; // Create the database connection MongoClient.connect(url, { poolSize: 10 // other options can go here },function(err, db) { assert.equal(null, err); mongodb=db; } ); global.mongodb = mongodb
Ở 1 file khác thì dùng sẽ là
const mongodb = global.mongodb // Use the connect method to connect to the server when the page is requested app.get('/', function(request, response) { mongodb.listCollections({}).toArray(function(err, collections) { assert.equal(null, err); collections.forEach(function(collection) { console.log(collection); }); }) response.send('See console for a list of available collections'); });
-
RE: Đa ngôn ngữ trong API sử dụng nodejs
@viet-huynh Bạn thiết kế gồm 3 phần nhé.
- Là cái middlewares của express. Chỗ này bạn xử lí làm sao đó. Request Object của Express chưa country or language. Ví dụ
req[lang] = 'vn'
- Setup i18n cho project của bạn
https://github.com/mashpie/i18n-node
. - Taij function handle error của express
app.use((err, req, res, next) => { ... })
Ở đoạn này bạn check req.lang -> rồi dùng i18 parse ra lỗi mà bạn tương thích.
P/S: Bạn chịu khó bỏ thời gian ra check từng cái nhỏ mình đưa. Cách handle. tóm gọn các bước mình xử lí sẽ là.
- Make sure biết đc lang của client (client gửi lên, hoặc check ip, hoặc lây default)
- Setup được fucntion dựa vào key -> return lại message tương ứng.
- Xử lí tịa function bắt error Handle của framework sử dụng. :3
- Là cái middlewares của express. Chỗ này bạn xử lí làm sao đó. Request Object của Express chưa country or language. Ví dụ
-
RE: Mình chạy có 1 trang để viết code thôi mà tới 40 kết nối tới mongodb?
@Kha-Pham Bạn có dùng 1 thư viên client nào không. Vì mongo sẽ dùng 1 thread tương ứng với 1 TCP socket connection được mở. Mà pooling của client chỉ config default là 5-10. Vậy thì > 5 - 10 thì bạn đã duplicate object connect -> duplicate thêm phần connect. (Còn cluster etc nữa)
Ex:app có 1 node có 1 db connect object và không gọi file db connect nhiều lần -> connections = config poolsize ~ 5 connections app có n node (cluster) , mỗi node có 1 db connec object và file db connect chỉ được gọi 1 lần -> connections = config poolsize * cluster -> 5*n (n=4 nodes -> 20 connections) Trường hợp bad nhất: 1 node có m db object do import file nhiều lần và không bọc lại bằng 1 class và getter setter -> connections = m * poolsize ~ m * (5 hoặc 10). Lúc này ví dụ bạn implement db file tới 10 file model -> m = 10 -> connections cỡ 10 *5 = 50 connections. Tuy nhiên vẫn xảy ra nếu bạn dùng lượng lớn các truy vấn. Và việc đợi poolsize thì quá slow.
Nếu bạn có sử dụng client libary mongodb nào thì nên đọc mục Pooling (poolsize, connection) để nắm rõ hơn.
Ví dụ nodejs-mongo-native: db.connect -> tạo ra 1 object db. (pool đc quản lý behind the scene). Nhưng cái này không singleton. Do đó khi bạn import nhiều lần mà không wrap lại = singleton -> db object duplicate -> Tăng lượng poolsize bị duplicate -> tăng connections nhiều.Note:
Limit connections của mongo là 2000.
Avg per connection của mongo là 1mb
https://github.com/Automattic/mongoose/issues/1172 -
RE: Hỏi cách limit document trả về trong hàm $lookup hoặc $graphLookup mongodb?
Tách ra limit dễ. Dùng lại cũng dễ. =)). Vì kiểu gì collection kia bản chả lưu 1 cái field để relation.
Ví dụ bài blog này nói về các thế mạnh, dở, và như hạch của mongo.: https://dzone.com/articles/mongodb-the-good-the-bad-and-the-ugly
Thì mục join của nó nằm ở cái như hạch. H thì mình k rõ. Ví dụ bạn thích sử dụng join nhiếu -> MySQL, Postgres. Còn bạn muốn nhưng model nó thiết kế flexible như kiểu action và source_action design table của tụi trend bây h thì dùng mongo =))). -
RE: Hỏi về cách lưu lịch sử thay đổi dữ liệu?
@Hậu-Chử
Bạn nên xem qua module winston. Nói sơ qua. Winston là module giúp bạn log thông tin ra. Thì nó có khái niệm transport. Nghĩa là khi bạn set mongo là transport. Lúc bạn logger cái info ra. Thì cũng là lúc nó được transfer để lưu vào cái server database bạn chọn để lưu (ở đây là mongo).
Bạn đọc 2 mục.- Winston: https://github.com/winstonjs/winston
- Sau đó bạn đọc về transport mongo của winston: https://github.com/winstonjs/winston-mongodb
Cách dùng khá dễ. 1 install 2 libary trên. 2 gọi winston ra. Và set transport cho winston là winston-mongodb trên. Lúc này cần lưu gì cứ logger.info(data), logger.etc...
Ps: Sau khi làm được với Mongo nên research thử với Elastic search. Vì data log sẽ dùng làm phân tích và thuiongw non-edit. Do đó Elastic sẽ best choice cho thằng log này hơn. Nhưng nên làm với mongo nếu nó vẫn đáp ứng được vấn đề của bạn.
-
RE: Promise
function query(query) { return new Promise((resolve, reject) => { db.query(query, (err,result) => { if(err) reject(err); resolve(JSON.parse(JSON.stringify(result))); }); }) } function render(req, res) { const promiseTheLoai = query("SELECT * FROM theloai"); const promiseLuaTuoi = query("SELECT * FROM luatuoi"); const promiseQuocGia = query("SELECT * FROM quocgia"); Promise.all([promiseTheLoai, promiseLuaTuoi, promiseQuocGia]).then((datas) => { console.log(datas); // => [data the loai, data lua tuoi, data quoc gia] res.render('addFilm',{ theloai: datas[0], tuoi: datas[1], quocgia: datas[2] }); }).catch(err => handleError(err)) }
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
Latest posts made by Nguyen Hien
-
RE: Lỗi khi import module
@Đỗ-Hoàng-Tiến node version bn vậy bạn. Node sp es6 mới có cú pháp import export
-
RE: Hỏi về cách sử dụng Sequelize trong node js.
@Lê-Minh-Hiệp MySQL version bạn dùng là bao nheieu vậy. MySQL 8.0 có 1 lỗi password authenticate với
caching_sha2_password
This is because caching_sha2_password is introduced in MySQL 8.0, but the Node.js version is not implemented yet. You can see this pull request (https://github.com/mysqljs/mysql/pull/1962) for more information. Probably a fix will come soon!
Hiện tại PR vẫn đang open. Nên cách fix bạn làm đỡ theo như vầy:
https://stackoverflow.com/questions/50093144/mysql-8-0-client-does-not-support-authentication-protocol-requested-by-server -
RE: Hỏi về network khi F12
@Đỗ-Hoàng-Tiến https://www.npmjs.com/package/rich-markdown-editor
Dùng markdown view ra thôi bạn -
RE: Hỏi về tình trạng Socket.IO khi dự án lớn có nhìu request
Cơ bản thì bạn phải phân tải cái socket.io của bạn ra (Cluster). Mỗi node chưa 1 lượng info của client connected thôi. Để làm được đơn giản thì có khái niệm redis-adapter.
Link: https://github.com/socketio/socket.io-redisBạn dùng cái này sử dụng redis Pub/Sub để node master quản lý các node con. Sau đó cluster cái instance run socket.io của bạn là ổn.
-
RE: Nên ghi log từ clients vào file hay database?
@Trà-Đất-Tổ dữ liệu lớn thì bạn dùng elastic nhé. Chuyên log audit. Hoặc bạn cũng có thể tạo 1 table trong db của bạn tên là audit. Rồi ghi vào db.
Tại sao không nên ghi vào file. Về cơ bản databse cũng là ghi vào file giống bạn. Nhưng db ghi có data structure. Có thể index, tim kiếm, sửa dễ dàng. Nên nếu chọn ghi vào file. Thà bạn ghi vào db nhé. Nó đảm bảo các tính acid hơn.
-
RE: (Express + Reactjs) Hỏi về response.headers của Reactjs khi gọi 1 api
@PeTer-E Response headers là do server ghi. Thường là proxy server ghi + app server ghi vào. Việc này client sẽ không xử lí đc. Với nữa có thể server vẫn sử dụng cached header cũ khi endpoint của bạn vẫn giống. Thì với trong khoảng tg ngắn đi. Có thể đã cached ở proxy hay app code. Bạn thử viết 2 endpoint. 1 set + 1 không set để track thử.
Và cái thứ 2 mình confuse là sao bạn biets đc cái request thứ tự. Đa số system h là concurrent system thì nếu track theo số lượng cũng sẽ không make sense theo thứ tự đươc. Vì nó đảm bảo tính reliable. Còn nếu lưu vào variables thì data sẽ mất mỗi lần khởi tạo 1 tiến trình xử lí request. Chỉ có cách lưu xuống storage nào đó như redis.
Bạn có thể show code backend + frontend để mọi người xem cho dễ phán đáon :))
-
RE: (Express + Reactjs) Hỏi về response.headers của Reactjs khi gọi 1 api
@PeTer-E endpoint của bạn có thay đổi ko
-
RE: [Mongodb] Hỏi về việc disconnect mongodb
@Đỗ-Hoàng-Tiến việc function chạy thì bạn vẫn đưa vào đc. Cái bạn confuse là sợ nó chưa chạy xong thì client gửi request. Lúc này global.mongodb ko có. Thì bth cái file 1 sẽ đc bọc trong 1 promise initialize function trước khi run app code ở các ngôn ngữ có sp event loop
Kiểu initialize().then(app.runserver)
Trong đó initialize hay dùng để seed data. Sync model và connect tới db. -
RE: Hỏi về AJAX
Có nhiều cách.
- Storage vào browser để load trang mới thì vẫn có.
- Dùng query string ở url.
- Là dùng 1 nodejs + engine render -> xử lí logic backend ra rồi gửi về client.
Cách ưu tiên tăng dần theo thứ tự
-
RE: Không tồn tại /socket.io/socket.io.js
@Vinsmoke-Sanji Haha. Good luck man. =))