Как отправить файл конкретному пользователю в nodejs - PullRequest
0 голосов
/ 28 февраля 2019

Я создаю API отдыха на nodejs.У меня есть электронный адрес и идентификатор пользователя в базе данных.Я хочу поделиться файлом (представленным на том же сервере) от одного пользователя конкретному пользователю.Может кто-нибудь сказать мне, как это можно сделать наилучшим образом?

Вот код, который я уже пробовал.

const server = require('./../server/server.js')
const socketIO = require('socket.io');
const io = socketIO(server);
const mongoose = require('mongoose');

const User = require('../models/user.js');
let sockets = [];

    io.on('connection', socket=>{
    console.log("User connected");

    socket.on('online', (data)=>{
        socket.name = data._id;
        sockets[data._id] = socket.id;
        console.log("user is online")
    })

    socket.on('send_file', (data)=>{
        User.find({emailId: data},{emailId:0, password:0})
        .exec()
        .then(userid => {
            if(userid.length<1){
            console.log("No such user");
            }
            else{
                console.log(userid[0].id);
                socket.to(sockets[userid[0].id]).emit('hello', "HELLO");
            }
        })
        .catch(err =>{
        console.log(err);
        });
    });

    socket.on('disconnect', ()=>{
        console.log("User disconnected");
    })
    })

    module.exports = io;

    server.listen('8080', (err)=>{
        if(err) throw err;
        console.log("running on port 8080");
    });

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

В случае данных не в реальном времени:

Сторона сервера -:

, используйте res.sendFile (), чтобы решить эту проблему.В дополнение к файлу отправьте идентификатор получателя и отправителя в заголовках

Сторона клиента -:

Увеличьте количество уведомлений, если идентификатор получателя соответствует зарегистрированному пользователю.

res.sendFile(path.join("path to file"),
            {headers:{
                    receiverid:result[0]._id,
                    senderid:result[1]._id
                }
            });

В случае данных в реальном времени: следуйте ответу, опубликованному TRomesh

0 голосов
/ 28 февраля 2019

Предполагая, что вы уже настроили socketio и экспресс-сервер должным образом с механизмом сохранения пути к файлу и имени файла в вашей базе данных.

Попробуйте что-то вроде этого (с socketio)

let sockets = [];

    io.on("connection", function(socket) {
      socket.on("online", data => {
        socket.name = data.username;
        sockets[data.username] = socket.id;
      });

      socket.on("send_file", function(data) {
        // your logic to retrieve the file path from you database in to the variable **filedata** 
        // let filedata = ................
        socket.to(sockets[data.user]).emit("file",filedata);
      });

      socket.on("disconnect", reason => {
        sockets.splice(sockets.findIndex(id => id === socket.id), 1);
      });

    });

в событии send_file вы получите имя пользователя от отправителя внутри объекта данных.Следующий код поможет вам отправить файл выбранному пользователю.

socket.to (sockets [data.user]). Emit ("file", filedata);

Ответ на ваш 1-й комментарий .

history.push () не обновит клиент, поскольку он является одностраничным приложением.Но когда вы обновляете (со стороны пользователя A ) новый сеанс сокета, то другой пользователь (пользователь B ) все еще будет ссылаться на старый сеанс сокета (который ужеотключен обновлением).Поэтому, чтобы справиться с этим, используйте следующие строки

 socket.on("online", data => {
    socket.name = data.username;
    sockets[data.username] = socket.id;
  });

, где вы будете хранить пул (массив) sockets с именами пользователей, поэтому, когда пользователь обновляет свой клиент, вновь созданный сокет будет ссылатьсятому же пользователю.Так как вы будете обновлять socket.id тому же человеку.Например, предположим, что вы пользователь, который обновляет клиента, а я другой пользователь.поэтому при обновлении будет создан новый сеанс сокета, и он будет отправлен на сервер вместе с именем пользователя.Когда данные поступают на сервер, он получает ваш объект сеанса из массива ( сокеты [data.username] ) и обновляет его новым сокетом, отправленным из вашего внешнего сокетов [данных.username] = socket.id; .

, чтобы это произошло, вам нужно будет отправить имя пользователя вместе с сообщением сокета.вот так

socket.emit("online", {
  username: "username"
});

Ответ на ваш второй комментарий Для отправки данных в режиме реального времени пользователи должны быть онлайн.если нет, вы можете просто создать массив уведомлений со следующей информацией (отправитель и получатель).Поэтому, когда получатель входит в систему или щелкает на панели уведомлений, может отображаться список уведомлений об общих файлах.Это всего лишь предположение, что вы можете придумать свою собственную идею.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...