#javascript #node.js #reactjs #mongodb #meteor
#javascript #node.js #reactjs #mongodb #meteor
Вопрос:
Я новичок в meteor, пытаюсь изменить обучающие коды, у меня есть код, прослушивающий пакеты на стороне сервера main.js. Мне также нужно вставить данные, напечатанные на консоли, в мою коллекцию базы данных.
import { Meteor } from 'meteor/meteor';
import '/imports/api/tasks';
import { createServer } from "net";
import { Tasks } from "../imports/api/tasks"
Meteor.startup(() => {
const server = createServer(socket => {
socket.write("SEND OK")
socket.on("data", data => {
const text = data.toString();
console.log(text);
})
})
server.listen(8080)
});
Вот код для моей базы данных в папке imports / API. Мне не удалось вставить с помощью методов meteor. Каков правильный способ сделать это?
import { Mongo } from 'meteor/mongo';
import { check } from 'meteor/check';
export const Tasks = new Mongo.Collection('tasks');
Meteor.methods({
'tasks.insert'(text) {
check(text, String);
Tasks.insert({
text,
createdAt: new Date,
owner: this.userId,
username: Meteor.users.findOne(this.userId).username
})
},
'tasks.remove'(taskId) {
check(taskId, String);
const task = Tasks.findOne(taskId);
Tasks.remove(taskId);
},
});
if (Meteor.isServer) {
Meteor.publish('tasks', function() {
return Tasks.find({
});
})
}
Комментарии:
1. В основном все выглядит нормально, но я немного смущен тем, зачем нужно создавать новый сервер сокетов, когда meteor уже делает это за вас. Поскольку вы создаете свой собственный сокет, ни один из выполняемых вами кодов не будет выполняться в оптоволокне или иметь доступ к среде Meteor.
2. Также.. Все созданные вами методы Meteor легко вызываются из клиента через
Meteor.call
. У вас должны возникнуть проблемы с их вызовом, только если вы подключаетесь с другого сервера или приложения, и тогда я бы определенно рекомендовал использовать DDP lib для упрощения подключения к вашему приложению Meteor.
Ответ №1:
Определение вашего метода выглядит хорошо и должно работать (включая вставку в коллекцию). Но вам не нужен метод для выполнения функций на стороне сервера. Поскольку ваш сервер сокетов, похоже, также работает на сервере (как и должно быть), вы можете просто вставить в коллекцию прямо оттуда. Например:
const server = createServer(Meteor.bindEnvironment(socket => {
socket.write("SEND OK")
socket.on("data", Meteor.bindEnvironment(data => {
const text = data.toString();
console.log(text);
Tasks.insert({
text,
createdAt: new Date
})
}))
}))
Конечно, поскольку это выполняется на сервере, для этих вставок не существует понятия «текущий пользователь». Как вы узнаете, для кого предназначены полученные данные? Является ли это частью данных, поступающих на сокет? Как только вы узнаете это, вы можете добавить код, чтобы добавить это так, owner
и username
как было у вас в определении вашего метода, а это, как я полагаю, та схема, которая вам нужна.
PS: обновлено на основе ошибки, упомянутой в комментариях
Комментарии:
1. Сейчас я попробовал точно такой же код, но получил ту же ошибку после того, как пакет был получен и напечатан на консоли. ` I20200824-20:33:59.194(3)? Это тестовый пакет W20200824-20:33:59.377(3)? (STDERR) пакетыmeteor.js: 1186 W20200824-20:33:59.389(3)? (STDERR) выдает новую ошибку («Код Meteor всегда должен выполняться внутри волокна. » W20200824-20:33:59.393(3)? (СТАНДАРТНЫЙ код) ^ W20200824-20:33:59.466(3)? (СТАНДАРТНЫЙ код) W20200824-20:33:59.475(3)? Ошибка (STDERR): Код Meteor всегда должен выполняться внутри оптоволокна. Попробуйте обернуть обратные вызовы, которые вы передаете в неметеоритные библиотеки, с помощью Meteor.bindEnvironment. `
2. о, вот с какой ошибкой вы столкнулись! Вы еще не упомянули об этом. Верно, да, вам нужно обернуть обратные вызовы с помощью
bindEnvironment
. Я обновил ответ.3. Это сработало, большое спасибо, я пытаюсь привыкнуть задавать вопросы здесь, извините за это и спасибо за предупреждение 🙂