ইউআরএলগুলি নিরাপদে যুক্ত করতে আমি কী প্রয়োজনীয় ("পথ") ব্যবহার করতে পারি?


128

require("path").joinইউআরএলগুলি একত্রিত করতে এটি কী নিরাপদ , উদাহরণস্বরূপ:

require("path").join("http://example.com", "ok"); 
//returns 'http://example.com/ok'

require("path").join("http://example.com/", "ok"); 
//returns 'http://example.com/ok'

যদি তা না হয় তবে আপনি কীভাবে আইএফএস-এর পূর্ণ কোড না লিখে এটি করার পরামর্শ দিবেন?



5
: যদি কেউ Windows এ path.join কিন্তু এড়ানোর বিষয় ব্যবহার করতে চায় path.posix.join('/one/two/three', 'four') // '/one/two/three/four, path.posix.join('/one/two/three/', 'four') // '/one/two/three/four,path.posix.join('/one/two/three/', '/four') // '/one/two/three/four
টিমোথি Zorn

5
@ টিমোথিজর্ন সমস্যাটি হ'ল এটি যদি আপনি কিছু করেন তবে এই জয়েন্টটি দ্বিগুণ চাপের path.posix.join('http://localhost:9887/one/two/three/', '/four')একটি থেকে মুক্তি পেয়ে যায়http://
ম্যাক্সেন্ড আলেকজান্ডার

আহ, হ্যাঁ - ভাল কথা। সেই পরিস্থিতিতে, আপনি ভালো কিছু করতে চাই চাই 'http://localhost:9887/one/two/three/'.replace(/^\/+|\/+$/, '') + '/' + '/four'.replace(/^\/+|\/+$/, '')এবং আপনি পারে না String.prototype.trimSlashes = function() { return this.replace(/^\/+|\/+$/, ''); }যদি আপনি বারবার রেগুলার এক্সপ্রেশন টাইপ করতে চাই না। stackoverflow.com/a/22387870/2537258
টিমোথি জর্ন

বা['http://localhost:9887/one/two/three/', '/four'].map((part) => part. replace(/^\/+|\/+$/, '')).join('/')
টিমোথি জর্ন

উত্তর:


141

নং path.join()URL গুলির সাথে ব্যবহার করার সময় ভুল মানগুলি ফিরিয়ে দেবে।

মনে হচ্ছে আপনি চান url.resolve। থেকে নোড ডক্স :

url.resolve('/one/two/three', 'four')         // '/one/two/four'
url.resolve('http://example.com/', '/one')    // 'http://example.com/one'
url.resolve('http://example.com/one', '/two') // 'http://example.com/two'

সম্পাদনা করুন: অ্যান্ড্রিয়াস যেমন একটি মন্তব্যে সঠিকভাবে নির্দেশ করেছেন, url.resolveকেবলমাত্র সমস্যাটি উদাহরণের মতো সহজ হলেই সহায়তা করবে। url.parseএই প্রশ্নের ক্ষেত্রেও প্রযোজ্য কারণ এটি ধারাবাহিকভাবে এবং প্রত্যাশিতভাবে ফর্ম্যাট করা ক্ষেত্রগুলি প্রত্যাশার মাধ্যমে প্রত্যাবর্তন URLকরে যা "আইএফএস-র পূর্ণ কোড" এর প্রয়োজনীয়তা হ্রাস করে।


1
যদিও আমি যা খুঁজছিলাম ঠিক তা-ই নয় যা আমার সমস্যাও সমাধান করে। সাহায্য করার জন্যে ধন্যবাদ!
রেনাটো গামা

6
@ আন্ড্রেসহল্টগ্রেন প্রথম মন্তব্যটি সঠিক। উদাহরণটি যদি হয় url.resolve('/one/two/three/', 'four')তবে আউটপুট হবে 'one/two/three/four'
tavnab

3
: যদি কেউ Windows এ path.join কিন্তু এড়ানোর বিষয় ব্যবহার করতে চায় path.posix.join('/one/two/three', 'four') // '/one/two/three/four, path.posix.join('/one/two/three/', 'four') // '/one/two/three/four,path.posix.join('/one/two/three/', '/four') // '/one/two/three/four
টিমোথি Zorn

2
মন্তব্যগুলি ভুল, url.resolve('/one/two/three', 'four') // '/one/two/four'উত্তরে সঠিক
জনাথন।

2
সচেতন থাকুন url.resolve()শুধুমাত্র 2 টি আর্গুমেন্ট লাগে, যেখানে path.join()কোনও সংখ্যা লাগে। সুতরাং আপনি যা করছেন তার উপর নির্ভর করে আপনার url.resolve(url.resolve(SERVER_URL, pagePath), queryString)
নীড়ের

47

না, path.join()ইউআরএল উপাদানগুলিতে যোগ দিতে আপনার ব্যবহার করা উচিত নয় ।

এখন এটি করার জন্য একটি প্যাকেজ রয়েছে। সুতরাং চাকাটিকে পুনরায় সঞ্চার করার পরিবর্তে, আপনার নিজের পরীক্ষাগুলি লিখুন, বাগগুলি সন্ধান করুন, সেগুলি ঠিক করুন, আরও পরীক্ষাগুলি লিখুন, এটি কাজ করে না এমন প্রান্তের কেস অনুসন্ধান করুন ইত্যাদি etc. আপনি এই প্যাকেজটি ব্যবহার করতে পারেন।

URL-যোগ

https://github.com/jfromaniello/url-join

ইনস্টল করুন

npm install url-join

ব্যবহার

var urljoin = require('url-join');

var fullUrl = urljoin('http://www.google.com', 'a', '/b/cd', '?foo=123');

console.log(fullUrl);

ছাপে:

' http://www.google.com/a/b/cd?foo=123 '


1
এই. এটি চমৎকার. ধন্যবাদ.
দুদেওয়াদ

7

অ্যাকজিওসের একটি সহায়ক ফাংশন রয়েছে যা ইউআরএল একত্রিত করতে পারে।

function combineURLs(baseURL, relativeURL) {
  return relativeURL
    ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
    : baseURL;
}

সূত্র: https://github.com/axios/axios/blob/fe7d09bb08fa1c0e414956b7fc760c80459b0a43/lib/helpers/combineURLs.js


1
খুব সুন্দর সমাধান, অনুলিপি + পেস্ট করুন :)
গিলাদ

6

আমি যখন url অংশগুলি সংযোগের জন্য PATH চেষ্টা করি তখন আমি সমস্যার মধ্যে পড়ে যাই। PATH.joinস্ট্রিপস '//' ডাউন টু '/' এবং এইভাবে একটি চূড়ান্ত ইউআরএলকে অকার্যকর করে তোলে (যেমন। http: // ... -> http: / ...)। আমার জন্য দ্রুত সমাধান ছিল:

baseurl.replace(/\/$/,"") + '/' + path.replace(/^\//,"") )

বা কর্নেল প্যানিক পোস্ট সহ সমাধান সহ:

[pathA.replace(/^\/|\/$/g,""),pathB.replace(/^\/|\/$/g,"")].join("/")

যদি আমি এর মতো মূল-সম্পর্কিত ইউআরএল তৈরি করার চেষ্টা করছি: তবে /assets/foo? এটি বর্তমান-পথে-সম্পর্কিত ইউআরএল-এ পরিণত হবে assets/foo
আন্দ্রে মিখায়লোভ - লোলমাস

5

না! উইন্ডোজে path.joinব্যাকস্ল্যাশগুলির সাথে যোগ দেবে। এইচটিটিপি ইউআরএল সর্বদা ফরোড্ড স্ল্যাশ হয়।

কেমন

> ["posts", "2013"].join("/")
'posts/2013'

ভাল ধারণা, কিন্তু যদি প্রথম যুক্তিটির ইতিমধ্যে ইতিমধ্যে একটি স্ল্যাশ থাকে? যেমন .: ["posts/", "2013"].join("/")?
রেনাতো গামা

1
@ রেনাটোগামা, posts//2013এখনও একটি বৈধ URL।
গুডউইন

2
it এটি বৈধ ইউআরআই হওয়া সত্ত্বেও সমস্ত ডোমেনে কাজ করবে না।
বিন্জবয়

2
বিশেষত, নোডের এক্সপ্রেস রাউটিংয়ের জন্য বহিরাগত স্ল্যাশগুলিকে উপেক্ষা করে না।
পার্সেইডস

1
: যদি কেউ Windows এ path.join কিন্তু এড়ানোর বিষয় ব্যবহার করতে চায় path.posix.join('/one/two/three', 'four') // '/one/two/three/four, path.posix.join('/one/two/three/', 'four') // '/one/two/three/four,path.posix.join('/one/two/three/', '/four') // '/one/two/three/four
টিমোথি Zorn


4

আপনি যদি ল্যাড্যাশ ব্যবহার করছেন তবে আপনি এই সাধারণ অনেলাইনারটি ব্যবহার করতে পারেন:

// returns part1/part2/part3
['part1/', '/part2', '/part3/'].map((s) => _.trim(s, '/')).join('/')

@ পিটার ডটচেভ এর উত্তর দ্বারা অনুপ্রাণিত


3

এটি আমি ব্যবহার করি:

function joinUrlElements() {
  var re1 = new RegExp('^\\/|\\/$','g'),
      elts = Array.prototype.slice.call(arguments);
  return elts.map(function(element){return element.replace(re1,""); }).join('/');
}

উদাহরণ:

url = joinUrlElements(config.mgmtServer, '/v1/o/', config.org, '/apps');

যদি আমি এর মতো মূল-সম্পর্কিত ইউআরএল তৈরি করার চেষ্টা করছি: তবে /assets/foo? এটি বর্তমান-পথে-সম্পর্কিত ইউআরএল-এ পরিণত হবে assets/foo
আন্দ্রে মিখায়লোভ - লোলমাস

1
একটি স্ল্যাশ প্রিপেন্ড করা? মানে, এটি একটি সহজ চেক; আপনি নিজে এটি যোগ করতে পারেন।
চিজো

3
এটি এভাবেই শুরু হয় ... পরবর্তী জিনিস আপনি কীভাবে জানেন যে আপনি একটি সংখ্যক 8+ ঘন্টা ব্যয় করেছেন এমন প্রান্তের কেসগুলি খুঁজে বের করে যাগুলি আপনার প্রকল্পের সময়গুলি স্থির করে না।
পাথর

3

আপনি যদি কৌণিক ব্যবহার করেন তবে আপনি অবস্থানটি ব্যবহার করতে পারেন :

import { Location } from '@angular/common';
// ...
Location.joinWithSlash('beginning', 'end');

যদিও শুধুমাত্র 2 টি আর্গুমেন্টে কাজ করে, তাই আপনাকে প্রয়োজন হলে কল করতে চেইন করতে হবে বা কোনও সহায়ক ফাংশন লিখতে হবে।


2

WHATWG URL টি বস্তু কন্সট্রাকটর টি (input, base)সংস্করণ, এবং inputব্যবহার আপেক্ষিক হতে পারে /, ./, ../। এর সাথে একত্রিত করুন path.posix.joinএবং আপনি যে কোনও কিছু করতে পারেন:

const {posix} = require ("path");
const withSlash = new URL("https://example.com:8443/something/");
new URL(posix.join("a", "b", "c"), withSlash).toString(); // 'https://example.com:8443/something/a/b/c'
new URL(posix.join("./a", "b", "c"), withSlash).toString(); // 'https://example.com:8443/something/a/b/c'
new URL(posix.join("/a", "b", "c"), withSlash).toString(); // 'https://example.com:8443/a/b/c'
new URL(posix.join("../a", "b", "c"), withSlash).toString(); // 'https://example.com:8443/a/b/c'
const noSlash = new URL("https://example.com:8443/something");
new URL(posix.join("./a", "b", "c"), noSlash).toString(); // 'https://example.com:8443/a/b/c'

0

টাইপস্ক্রিপ্ট কাস্টম সমাধান:

export function pathJoin(parts: string[], sep: string) {
  return parts
    .map(part => {
      const part2 = part.endsWith(sep) ? part.substring(0, part.length - 1) : part;
      return part2.startsWith(sep) ? part2.substr(1) : part2;
    })
    .join(sep);
}

expect(pathJoin(['a', 'b', 'c', 'd'], '/')).toEqual('a/b/c/d');
expect(pathJoin(['a/', '/b/', 'c/', 'd'], '/')).toEqual('a/b/c/d');
expect(pathJoin(['http://abc.de', 'users/login'], '/')).toEqual('http://abc.de/users/login');

0

আমার সমাধান

path.join(SERVER_URL, imageAbsolutePath).replace(':/','://');

সম্পাদনা করুন: আপনি যদি উইন্ডোজের পরিবেশকে সমর্থন করতে চান

path.join(SERVER_URL, imageAbsolutePath).replace(/\\/g,'/').replace(':/','://');

দ্বিতীয় সমাধানটি সমস্ত ব্যাকস্ল্যাশগুলিকে প্রতিস্থাপন করবে, সুতরাং ক্যোরিস্ট্রিং এবং হ্যাশের মতো ইউআরএল অংশগুলিও পরিবর্তিত হতে পারে, তবে বিষয়টি কেবল url পথে যোগ দিচ্ছে, তাই আমি এটিকে কোনও বিষয় বিবেচনা করি না।


0

অন্যান্য কার্যকরী উত্তর রয়েছে, তবে আমি নিম্নলিখিতগুলি দিয়ে চলেছি। একটু পথ.জয়িন / ইউআরএল কম্বো।

const path = require('path');
//
const baseUrl = 'http://ejemplo.mx';
// making odd shaped path pieces to see how they're handled.
const pieces = ['way//', '//over/', 'there/'];
//
console.log(new URL(path.join(...pieces), baseUrl).href);
// http://ejemplo.mx/way/over/there/

// path.join expects strings. Just an example how to ensure your pieces are Strings.
const allString = ['down', 'yonder', 20000].map(String);
console.log(new URL(path.join(...allString), baseUrl).href);
// http://ejemplo.mx/down/yonder/20000

0

নোডের পথ এবং URL এর সংমিশ্রণ দ্বারা এটি সম্পন্ন করা যেতে পারে :

  1. প্যাকেজগুলির প্রয়োজন:
const nodeUrl = require('url')
const nodePath = require('path')
  1. এর সাথে কাজ করার জন্য একটি URL অবজেক্ট তৈরি করে শুরু করুন:
> const myUrl = new nodeUrl.URL('https://example.com')
  1. যে কোনও সম্ভাব্য সংমিশ্রণটি ব্যবহার করুন pathname=এবং তৈরি path.joinকরতে:
> myUrl.pathname = nodePath.join('/search', 'for', '/something/')
'/search/for/something/'

(আপনি path.joinআর্গুমেন্ট সহ উদারপন্থী দেখতে পারেন )

  1. এই মুহুর্তে আপনার URL চূড়ান্ত পছন্দসই ফলাফল প্রতিফলিত করে:
> myUrl.toString()
'https://example.com/search/for/something/'

কেন এই পদ্ধতির?

এই কৌশলটি অন্তর্নির্মিত লাইব্রেরি ব্যবহার করে। সিভিই, রক্ষণাবেক্ষণ ইত্যাদির ক্ষেত্রে তৃতীয় পক্ষের কম নির্ভরতা তত ভাল when

পিএস: ইউআরএলকে কখনও স্ট্রিং হিসাবে চালিত করবেন না!

আমি কোডটি পর্যালোচনা যখন আমি সম্পর্কে অনড় আছি কখনো নিজে স্ট্রিং হিসাবে URL গুলি সাধিত । একটির জন্য, দেখুন অনুমানটি কতটা জটিল ।

দ্বিতীয়ত, একটি পিছনে / উপসর্গযুক্ত স্ল্যাশ ( /) এর অনুপস্থিতি / উপস্থিতি সবকিছু ভেঙে ফেলার কারণ নয়! আপনার কখনই করা উচিত নয়:

const url = `${baseUrl}/${somePath}`

এবং বিশেষত:

uri: host + '/' + SAT_SERVICE + '/' + CONSTELLATION + '/',

যার মধ্যে আমি কেবল একটি কোড বেসে মুখোমুখি হয়েছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.