Tránh lỗi Net.createConnection trong Node
Tôi hiện đang xây dựng một ứng dụng với React và Node.js
Trong ứng dụng này, tôi cần truy vấn cơ sở dữ liệu trên máy chủ của riêng mình bằng chức năng sau, nằm trong một tệp riêng biệt có tên "database.js"
const fetchQuery = util.promisify(con.query).bind(con)
// Get all the tracks for a given date from the
const fetchTracks = async (date) => {
const rows = await fetchQuery("SELECT * FROM tracks WHERE playlistDate = '"+date+"'");
}
Điều này hoạt động hoàn hảo khi tôi chạy tệp với Node từ dòng lệnh. Tuy nhiên, khi tôi cố gắng nhập nó vào ứng dụng phản ứng của mình với
import { fetchTracks, addTracks } from '../scripts/database'
Tôi bắt đầu gặp lỗi trong tệp cơ sở dữ liệu, cụ thể là Unhandled Rejection (TypeError): Net.createConnection is not a functiontrong cuộc gọi fetchQuery của tôi.
Theo những gì tôi đã đọc, điều này xảy ra khi cố gắng gọi hàm từ trình duyệt, vì điều đó sẽ gây ra rủi ro bảo mật. Tuy nhiên, theo tôi hiểu, tất cả các hoạt động của nút đều được thực hiện ở phía máy chủ, phải không? Tại sao tôi nhận được cờ này khi cơ sở dữ liệu được cho là đã được truy vấn trước khi trang được phục vụ? Tôi cần làm gì để sửa đổi điều này?
Trả lời
React chạy trong trình duyệt, vì vậy ngay sau khi bạn đưa database.jsvào ứng dụng React của mình, nó sẽ chạy trong trình duyệt với phần còn lại của React, vì vậy tất nhiên bạn sẽ gặp lỗi. Thực hiện công việc này cung cấp hai tùy chọn:
hiển thị một điểm cuối API từ Node để React gọi và điểm cuối API đó gọi database.js hoặc,
điều tra kết xuất phía máy chủ cho React, nơi một số ứng dụng React của bạn - cụ thể là các phần tĩnh hơn của nó như menu chính của bạn - được tạo ở phía Node và chỉ HTML cuối cùng được gửi đến trình duyệt. (Mặc dù vậy, đây là một chủ đề lớn.)
Bằng ví dụ của bạn trong đó có tham số ngày cho SQL, tôi đoán # 2 không phải là một tùy chọn.