javascript - "TypeError: Cannot read property 'replace' of undefined" - Stack Overflow

I have been trying to make my first express application and I have been getting a error with range.repl

I have been trying to make my first express application and I have been getting a error with range.replace() and I tried searching for a fix and I couldn't find one This accured while I was trying to stream video. And this is my first time using express so ignore the html scripts at the app.send() :)

My code is:

const express = require('express');
const app = express();
const fs = require('fs')
const path = require('path')
require('dotenv').config();
const { auth, requiresAuth } = require('express-openid-connect');

app.use(
    auth({
        authRequired: false,
        auth0Logout: true,
        issuerBaseURL: process.env.ISSUER_BASE_URL,
        baseURL: process.env.BASE_URL,
        clientID: process.env.CLIENT_ID,
        secret: process.env.SECRET,
    })
);

app.get('/profil', requiresAuth(), (req, res) => {
    const profileJSON = JSON.stringify(req.oidc.user);
    var obj = JSON.parse(profileJSON);
    function emailVerified(){
        if (obj.email_verified == "true"){
            return "Doğrulandı";
        }
        else {
            return "Doğrulanmadı";
        }
    }
    res.send(
        `
        <!DOCTYPE html>
        <head>
            <title>Profil sayfası</title>
        </head>
        <body>
            <h1>${obj.nickname}</h1>
            <img src="${obj.picture}"></img>
            <h2>Gerçek isim: ${obj.name}</h2>
            <h2>E-posta: ${obj.email}</h2>
            <h2>E-Posta Doğeulanma Durumu: ${obj.email_verified}</h2>
            <h2>Ülke: ${obj.locale}<h2>
        </body>
        `
    );
})


app.get('/', (req, res)=>{
    res.send(req.oidc.isAuthenticated() ? `
    <!DOCTYPE html>
    <head>
        <title>Murat Ödev Sayfası</title>
    </head>
    <body>
        <h1>Murat Ödev Sayfası</h1>
        <h2>Giriş Durumu: Giriş yapıldı<h2><a href="/logout">Çıkış yap</a>
        <a href="/profil">Profil sayfası</a>
        <a href="/video">Video test</a>
    </body>
    ` : `
    <!DOCTYPE html>
    <head>
        <title>Murat Ödev Sayfası</title>
    </head>
    <body>
        <h1>Murat Ödev Sayfası</h1>
        <h2>Giriş Durumu: Giriş yapılmadı<h2><a href="/login">Giriş yap</a>
    </body>
    `)
})


app.get('/video', requiresAuth(),(req, res) => {
    const range = req.headers.range;
  if (!range) {
    res.status(400).send("Requires Range header");
  }

  // get video stats (about 61MB)
  const videoPath = "video.mp4";
  const videoSize = fs.statSync("video.mp4").size;

  // Parse Range
  // Example: "bytes=32324-"
  const CHUNK_SIZE = 10 ** 6; // 1MB
  const start = Number(range.replace("/\D/g", ""));
  const end = Math.min(start + CHUNK_SIZE, videoSize - 1);

  // Create headers
  const contentLength = end - start + 1;
  const headers = {
    "Content-Range": `bytes ${start}-${end}/${videoSize}`,
    "Accept-Ranges": "bytes",
    "Content-Length": contentLength,
    "Content-Type": "video/mp4",
  };

  // HTTP Status 206 for Partial Content
  res.writeHead(206, headers);

  // create video read stream for this particular chunk
  const videoStream = fs.createReadStream(videoPath, { start, end });

  // Stream the video chunk to the client
  videoStream.pipe(res);
})

const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`Listening on port ${port}`);
})

and the error is:

TypeError: Cannot read property 'replace' of undefined

I hope theres someone that can help me

I have been trying to make my first express application and I have been getting a error with range.replace() and I tried searching for a fix and I couldn't find one This accured while I was trying to stream video. And this is my first time using express so ignore the html scripts at the app.send() :)

My code is:

const express = require('express');
const app = express();
const fs = require('fs')
const path = require('path')
require('dotenv').config();
const { auth, requiresAuth } = require('express-openid-connect');

app.use(
    auth({
        authRequired: false,
        auth0Logout: true,
        issuerBaseURL: process.env.ISSUER_BASE_URL,
        baseURL: process.env.BASE_URL,
        clientID: process.env.CLIENT_ID,
        secret: process.env.SECRET,
    })
);

app.get('/profil', requiresAuth(), (req, res) => {
    const profileJSON = JSON.stringify(req.oidc.user);
    var obj = JSON.parse(profileJSON);
    function emailVerified(){
        if (obj.email_verified == "true"){
            return "Doğrulandı";
        }
        else {
            return "Doğrulanmadı";
        }
    }
    res.send(
        `
        <!DOCTYPE html>
        <head>
            <title>Profil sayfası</title>
        </head>
        <body>
            <h1>${obj.nickname}</h1>
            <img src="${obj.picture}"></img>
            <h2>Gerçek isim: ${obj.name}</h2>
            <h2>E-posta: ${obj.email}</h2>
            <h2>E-Posta Doğeulanma Durumu: ${obj.email_verified}</h2>
            <h2>Ülke: ${obj.locale}<h2>
        </body>
        `
    );
})


app.get('/', (req, res)=>{
    res.send(req.oidc.isAuthenticated() ? `
    <!DOCTYPE html>
    <head>
        <title>Murat Ödev Sayfası</title>
    </head>
    <body>
        <h1>Murat Ödev Sayfası</h1>
        <h2>Giriş Durumu: Giriş yapıldı<h2><a href="/logout">Çıkış yap</a>
        <a href="/profil">Profil sayfası</a>
        <a href="/video">Video test</a>
    </body>
    ` : `
    <!DOCTYPE html>
    <head>
        <title>Murat Ödev Sayfası</title>
    </head>
    <body>
        <h1>Murat Ödev Sayfası</h1>
        <h2>Giriş Durumu: Giriş yapılmadı<h2><a href="/login">Giriş yap</a>
    </body>
    `)
})


app.get('/video', requiresAuth(),(req, res) => {
    const range = req.headers.range;
  if (!range) {
    res.status(400).send("Requires Range header");
  }

  // get video stats (about 61MB)
  const videoPath = "video.mp4";
  const videoSize = fs.statSync("video.mp4").size;

  // Parse Range
  // Example: "bytes=32324-"
  const CHUNK_SIZE = 10 ** 6; // 1MB
  const start = Number(range.replace("/\D/g", ""));
  const end = Math.min(start + CHUNK_SIZE, videoSize - 1);

  // Create headers
  const contentLength = end - start + 1;
  const headers = {
    "Content-Range": `bytes ${start}-${end}/${videoSize}`,
    "Accept-Ranges": "bytes",
    "Content-Length": contentLength,
    "Content-Type": "video/mp4",
  };

  // HTTP Status 206 for Partial Content
  res.writeHead(206, headers);

  // create video read stream for this particular chunk
  const videoStream = fs.createReadStream(videoPath, { start, end });

  // Stream the video chunk to the client
  videoStream.pipe(res);
})

const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`Listening on port ${port}`);
})

and the error is:

TypeError: Cannot read property 'replace' of undefined

I hope theres someone that can help me

Share Improve this question asked Dec 23, 2020 at 14:24 kaan tekelikaan tekeli 111 gold badge2 silver badges4 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 1

You do the following to see is range defined

if (!range) {
  res.status(400).send("Requires Range header");
}

You are correctly looking for the error condition, but the problem here is you are not exiting out so it continues and hence why you are getting the error. Add return to exit the function

if (!range) {
  res.status(400).send("Requires Range header");
  return;
}

You are calling replace() on a variable that is undefined. If you debug your code you can easily see this.

You do check whether range is defined. If it is undefined you send a 400 status. But this does not end the function. Again, this can easily be seen when debugging your code.

You should return inside the then block or put the rest of the code inside an else block.

Why is range undefined? Apparently this header is not in the request. Also, the offical way to get a header according to the Express documentation is req.get('range').

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745320061a4622402.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信