最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

programmeradmin1浏览0评论

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').

发布评论

评论列表(0)

  1. 暂无评论