Ошибка машинописного текста для "app.ws" при использовании express-ws - PullRequest
0 голосов
/ 01 декабря 2018

В моем небольшом проекте я хочу создать BabyCam, доступ к которому можно получить из любого веб-браузера с помощью Raspberry Pi Zero.Для этого я хотел бы открыть веб-сокет, используя функцию экспресс-передачи потокового видео нескольким клиентам.Я основываю большую часть кода, относящегося к видео, на модуле raspivid-stream .Однако при попытке получить доступ к веб-сокету я получаю сообщение об ошибке типа app.ws(..., указывающее Property 'ws' does not exist on type 'Application'.Конечно, я импортировал оба типа для express и express-ws.

Я не совсем уверен, что проблема в том, что один и тот же вызов в JavaScript выглядит нормально.Вот код - я рад любой помощи!

import express from 'express';
import { Request, Response } from 'express';
import fs from 'fs';
import https from 'https';
import http from 'http';
import raspividStream from 'raspivid-stream';
import expressWs from 'express-ws';


const server: express.Application = express();

const httpPort: number = 8080;
const httpsPort: number = 8443;

const sslCredentials = {
    key: fs.readFileSync('../ssl/localhost.key', 'utf8'),
    cert: fs.readFileSync('../ssl/localhost.cert', 'utf8')
};

// CREATE SERVER

const httpServer = http.createServer(server);
const httpsServer = https.createServer(sslCredentials, server);

expressWs(server, httpsServer);

// ROUTES

server.get('*', (req: Request, res:Response) => {
    if (!req.secure) {
        return res.redirect(`https://${req.hostname}:${httpsPort}${req.originalUrl}`);
    }
    res.sendFile(__dirname + '/client/index.html');
});

// WEBSOCKET

server.ws('/video-stream', (ws) => {
    console.log('Client connected');


    ws.send(JSON.stringify({
    action: 'init',
    width: '960',
    height: '540'
    }));

    var videoStream = raspividStream({ rotation: 180 });

    videoStream.on('data', (data) => {
        ws.send(data, { binary: true }, (error) => { if (error) console.error(error); });
    });

    ws.on('close', () => {
        console.log('Client left');
        videoStream.removeAllListeners('data');
    });
});


// START SERVER

httpServer.listen(httpPort, () => {
    console.log(`BabyCam (redirect) listening at http://localhost:${httpPort}/`);
}); 

httpsServer.listen(httpsPort, () => {
    console.log(`BabyCam (SSL) listening at https://localhost:${httpsPort}/`);
});

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Я посмотрел на https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/express-ws/index.d.ts.

Вот что (я думаю) означал ответ Страмского:

import * as path from 'path';
import * as express from 'express';
import * as expressWs from 'express-ws';

const SERVER_PORT = 8090;

let appBase = express();
let wsInstance = expressWs(appBase);
let { app } = wsInstance; // let app = wsInstance.app;

// Http Routes
app.use('/assets', express.static(path.join(process.cwd(), 'assets')));

// Ws Routes
app.ws('/echotwice', (ws, req) => {
  ws.on('message', msg => {
    ws.send(msg + msg);
  });
});

app.listen(SERVER_PORT, () => {
  console.log(`App listening on port ${SERVER_PORT}!`);
});
0 голосов
/ 02 декабря 2018

Express.Application не имеет члена с именем ws.Это ошибка, которую вы получаете.Вам необходимо использовать возвращаемое значение expressWS (сервер, httpsServer).Приложение, к которому вы можете получить доступ, напечатано как Express.Application & WithWebsocketMethod.

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